创建型设计-抽象工厂

Posted 秋天de枫叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建型设计-抽象工厂相关的知识,希望对你有一定的参考价值。

          

    声明一下:本文的文字多数文字都是来自网上,只有例子是自己写的。因为自我感觉还没有能力能够系统的解释一个模式,已经有现成的比较完善的说明,就不重复造轮子哈。


    抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。


适用场景:
       当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。

      抽象工厂类图:

demo:

抽象工厂类:

public interface IAutomobileFactory 
    IAutomobile3_4Liter car3_4parts();
    IAutomobile2_4Litre car2_4parts();
具体工厂实现1:

public class BenzFactory implements IAutomobileFactory 
    @Override
    public IAutomobile3_4Liter car3_4parts() 
        return new Automobile3_4LiterImpl();
    
    @Override
    public IAutomobile2_4Litre car2_4parts() 
        return new Automobile2_4LiterImpl();
    
实现2:

public class AudiFactory implements IAutomobileFactory 
    @Override
    public IAutomobile3_4Liter car3_4parts() 
        return new Automobile3_4LiterImpl();
    
    @Override
    public IAutomobile2_4Litre car2_4parts() 
        return new Automobile2_4LiterImpl();
    

抽象产品类:

public interface IAutomobile2_4Litre 
    void Create2_4Engine();
    void Create2_4Tyre();
public interface IAutomobile3_4Liter 
    void Create3_4Engine();
    void create3_4Tyre();


具体的产品实现1:

public class Automobile2_4LiterImpl implements IAutomobile2_4Litre 
    @Override
    public void Create2_4Engine() 
        System.out.println("制造发动机,奥迪2.4");
    
    @Override
    public void Create2_4Tyre() 
        System.out.println("制造轮胎,奥迪2.4");
    
实现2:

public class Automobile3_4LiterImpl implements IAutomobile3_4Liter 
    @Override
    public void Create3_4Engine() 
        System.out.println("制造发动机,奔驰3.4");
    
    @Override
    public void create3_4Tyre() 
        System.out.println("制造轮胎,奔驰3.4");
    


调用端:(Client)

public class main 
    public static void main(String[] args) 
        IAutomobileFactory audiFactory=new AudiFactory(); //实例化奥迪工厂
        IAutomobile2_4Litre audi2_4= audiFactory.car2_4parts(); //返回奥迪工厂里创建2.4升汽车的零件对象
        audi2_4.Create2_4Engine(); //发动机
        audi2_4.Create2_4Tyre(); //轮胎
        IAutomobileFactory benzFactory=new BenzFactory();//实例化奔驰工厂
        IAutomobile3_4Liter benz=benzFactory.car3_4parts();//返回奔驰工厂里创建3.4升汽车的零件对象
        benz.Create3_4Engine();
        benz.create3_4Tyre();
    
输出结果:

制造发动机,奥迪2.4
制造轮胎,奥迪2.4
制造发动机,奔驰3.4
制造轮胎,奔驰3.4


抽象工厂优缺点:

优点:

      抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。

缺点:

      产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。




以上是关于创建型设计-抽象工厂的主要内容,如果未能解决你的问题,请参考以下文章

设计模式——创建型模式之抽象工厂模式

设计模式-抽象工厂

创建型设计模式抽象工厂模式

4设计模式-创建型模式-抽象工厂模式

抽象工厂模式

抽象工厂模式