创建型设计-抽象工厂

          

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


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


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

      抽象工厂类图:

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


抽象工厂优缺点:

优点:

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

缺点:

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值