创建型设计模式(二)抽象工厂模式

一、一句话背景

假如我是一个汽车经销商,那我不光是卖车,也得卖相关的配件吧,比如润滑油,轮胎之类的,那我能不能整一个抽象的工厂,我需要啥直接告诉这个抽象工厂,具体生产哪一类产品让这个抽象工厂自己去对接,这样我不管需要啥都只用找这个抽象工厂的负责人就可以,而不用找每一类具体产品工厂的负责人,我可就省事多了~

二、使用场景

调用一整套产品族的场景。

如:参加不同类型的抽奖活动,QQ换皮肤

三、模型分析

生产流水线:接口,定义生产具体产品的方法

具体产品的生产流水线:类,定义生产具体特征(颜色,品牌等)产品的方法,生产流水线接口的具体实现

工厂:类,需要根据客户需求调用不同的流水线来生产具体产品

抽象工厂:抽象类,负责对接各类产品的工厂

四、代码分析

生产流水线

/**
 * 创建一个生产流水线接口,定义生产汽车的方法
 */
public interface CarProductionLine{
    //生产汽车的方法
    void produceCar();
}
/**
 * 创建一个生产流水线接口,定义生产轮胎的方法
 */
public interface TireProductionLine{
    //生产轮胎的方法
    void produceTire();
}

各个品牌汽车的生产流水线(具体产品的生产流水线)

/**
 * 宝马车生产流水线
 */
public class BmwProductionLine implements CarProductionLine {

    @Override
    public void produceCar() {
        //实现生产流水线接口定义的方法,生产宝马车
        System.out.println("整台宝马来开~");
    }
}
/**
 * 奔驰车生产流水线
 */
public class BenzProductionLine implements CarProductionLine {

    @Override
    public void produceCar() {
        //实现生产流水线接口定义的方法,生产奔驰车
        System.out.println("整台奔驰来开~");
    }
}
/**
 * 奥迪车生产流水线
 */
public class AudiProductionLine implements CarProductionLine {

    @Override
    public void produceCar() {
        //实现生产流水线接口定义的方法,生产奥迪车
        System.out.println("整台奥迪来开~");
    }
}

各个品牌轮胎的生产流水线(具体产品的生产流水线)

/**
 * 米其林轮胎生产流水线
 */
public class MQLProductionLine implements TireProductionLine {

    @Override
    public void produceTire() {
        //实现生产流水线接口定义的方法,生产米其林轮胎
        System.out.println("生产米其林轮胎~");
    }
}
/**
 * 固特异轮胎生产流水线
 */
public class GTYProductionLine implements TireProductionLine {

    @Override
    public void produceTire() {
        //实现生产流水线接口定义的方法,生产固特异轮胎
        System.out.println("生产固特异轮胎~");
    }
}

汽车工厂(工厂)

/**
 * 汽车生产工厂
 */
public class CarFactory extends AbstractFactory {

    //使用 getCar 方法调用不同的生产线
    @Override
    public CarProductionLine getCar(String carBrand) {
        if (carBrand == null) {
            return null;
        }
        if (carBrand.equalsIgnoreCase("bmw")) {
            return new BmwProductionLine();
        } else if (carBrand.equalsIgnoreCase("benz")) {
            return new BenzProductionLine();
        } else if (carBrand.equalsIgnoreCase("audi")) {
            return new AudiProductionLine();
        }
        return null;
    }

    @Override
    public TireProductionLine getTire(String tireBrand) {
        return null;
    }
}

轮胎工厂(工厂)

/**
 * 轮胎生产工厂
 */
public class TireFactory extends AbstractFactory {

    @Override
    public CarProductionLine getCar(String carBrand) {
        return null;
    }

    //使用 getTire 方法调用不同的生产线
    @Override
    public TireProductionLine getTire(String tireBrand) {
        if (tireBrand == null) {
            return null;
        }
        if (tireBrand.equalsIgnoreCase("mql")) {
            return new MQLProductionLine();
        } else if (tireBrand.equalsIgnoreCase("gty")) {
            return new GTYProductionLine();
        }
        return null;
    }
}

抽象工厂(抽象工厂)

/**
 * 抽象工厂,定义了调用工厂的方法
 */
public abstract class AbstractFactory {
    public abstract CarProductionLine getCar(String carBrand);

    public abstract TireProductionLine getTire(String tireBrand);
}

工厂生成器(模拟抽象工厂负责人的工作)

/**
 * 工厂生成器
 */
public class FactoryProducer {
    public static AbstractFactory getFactory(String choice) {
        if (choice.equalsIgnoreCase("car")) {
            return new CarFactory();
        } else if (choice.equalsIgnoreCase("tire")) {
            return new TireFactory();
        }
        return null;
    }
}

原文地址:https://www.cnblogs.com/riches/p/11200185.html

时间: 2024-08-29 11:40:56

创建型设计模式(二)抽象工厂模式的相关文章

设计模式系列一创建型之(抽象工厂模式)

1.抽象工厂简介 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作. 如何应对这种变化? 如何绕过常规的对象的创建方法(new)? 如何来避免客户程序和这种“多系列具体对象创建工作”的紧耦合? 然而抽象工厂便可以很好地解决这个问题! 2.意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 3.适用性 一个系统要独立与它的产品创建.组合和表示时 一个系统要由多个产品系列中的一个来配置时 当你要强调一系列相关的产

设计模式之抽象工厂模式20170803

创建型设计模式之抽象工厂模式: 一.含义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 具体来说, 为一组具有相同约束(属性)的对象,提供一个接口,这个接口下有不同的实现,每个实现类对应一种类型的约束(一种具体的属性),同时提供该类型的约束(属性)下所有对象的创建方法 二.代码说明 1.主要有两个角色 1)一组互相影响的产品线(对象),也叫做产品族 2)抽象工厂类及其实现类 抽象工厂类:在N个产品族中,在抽象工厂类中就应该有N个创建方法 实现类:具体实现类是产品族的具体

C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】

原文:C#设计模式之三抽象工厂模式(AbstractFactory)[创建型] 一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简单工厂]模式所面对的问题,它的问题就是:如果我们增加新的产品,工厂类的方法就要修改本身的代码,增加产品越多,其逻辑越复杂,同时这样的修改也是不符合[开放关闭原则OCP],对修改代码关闭,对增加代码开放.为了解决[简单工厂

设计模式之抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 最大的好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体工厂即可使用不同的产品配置. 他使具体创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离. 下面的代码还使用了反射与XML. 代码如下: using System; using System.Collections.Ge

大话设计模式_抽象工厂模式(Java代码)

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. 简单描述:有多种抽象产品,并且每种抽象产品都有多个具体产品.一个抽象工厂,提供多个具体工厂,每个工厂则提供不同种类的具体产品. 大话设计模式中的截图: 例子代码: AbstractProductA类: 1 package com.longsheng.abstractfactory; 2 3 public abstract class AbstractProductA { 4 5 public abstract v

设计模式三—抽象工厂模式

设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是园丁2的杰作 1.Fruit.java public interface Fruit { /* * 生长 * 收获 * 栽种 */ public void grow(); public void harvest(); public void plant(); } 2.Apple.java publi

设计模式之抽象工厂模式(Abstract Factory)

1.定义 抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.类图 由于类太多就不上源码了~ 最佳实践: 在一个应用中,需要在三个不同平台(Windows.Linux.Android)上运行,通过抽象工厂模式屏蔽掉操作系统对应的影响三个不同操作系统上的软件功能.应用逻辑.UI都应该是非常类似的,唯一不同的是调用不同的工厂方法,由不同的产品类去处理与操作系统交互的信息. 设计模式之抽象工厂模式(Abstract Factory)

C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】

一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简单工厂]模式所面对的问题,它的问题就是:如果我们增加新的产品,工厂类的方法就要修改本身的代码,增加产品越多,其逻辑越复杂,同时这样的修改也是不符合[开放关闭原则OCP],对修改代码关闭,对增加代码开放.为了解决[简单工厂]的问题,我们引出了[工厂方法]模式,通过子类化工厂类,解决了工厂类责任的划分,

二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Message有一个Insert()方法,该方法的参数是MessageModel. AbstractMessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Abstract

java设计模式之二抽象工厂模式(Abstract Factory)

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码.因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解. 1 package com.qcf.test2; 2 /** 3 * 抽象工厂模式 4 * 为方法创建一个接口 5 * 为工厂类创建一个接口 6 * 如果再