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

来源:互联网 发布:淘宝无线端怎么推广 编辑:程序博客网 时间:2024/05/23 15:52

上两篇讲解了简单工厂模式和工厂方法模式,下面讲解工厂模式的最后一个抽象工厂模式

随着客户的要求越来越高,宝马车需要不同配置的空调和发动机等配件。于是这个工厂开始生产空调和发动机,用来组装汽车。这时候工厂有两个系列的产品:空调和发动机。宝马320Li系列配置A型号空调和A型号发动机,宝马520Li系列配置B型号空调和B型号发动机。


概念:

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。

先看看UML图:
这里写图片描述

上面我们有两种产品:空调Aircondition和引擎Engine,它们都有不同的型号,抽象工厂类AbstractFactoryBMW定义了需要生成空调和引擎,具体的工厂类按需生产相应的空调和引擎产品,下面是代码:
产品类:

//发动机以及型号public interface Engine {}public class EngineA implements Engine{    public EngineA(){        System.out.println("制造-->EngineA");    }}public class EngineB implements Engine{    public EngineB(){        System.out.println("制造-->EngineB");    }}//空调以及型号public interface Aircondition {}public class AirconditionA implements Aircondition{    public AirconditionA(){        System.out.println("制造-->AirconditionA");    }}public class AirconditionB implements Aircondition{    public AirconditionB(){        System.out.println("制造-->AirconditionB");    }}

工厂类:

//创建工厂的接口public interface AbstractFactoryBMW {    //制造发动机    public Engine createEngine();    //制造空调    public Aircondition createAircondition();}//为宝马320系列生产配件public class FactoryBMW320Li implements AbstractFactoryBMW{    @Override    public Engine createEngine() {        return new EngineA();    }    @Override    public Aircondition createAircondition() {        return new AirconditionA();    }}//宝马520系列public class FactoryBMW520Li implements AbstractFactoryBMW {    @Override    public Engine createEngine() {        return new EngineB();    }    @Override    public Aircondition createAircondition() {        return new AirconditionB();    }}

客户:

 public class Customer {    public static void main(String[] args){        //生产宝马320Li系列配件        FactoryBMW320Li factoryBMW320Li = new FactoryBMW320Li();        factoryBMW320Li.createEngine();        factoryBMW320Li.createAircondition();        //生产宝马520Li系列配件        FactoryBMW520Li factoryBMW523Li = new FactoryBMW520Li();        factoryBMW523Li.createEngine();        factoryBMW523Li.createAircondition();    }}

抽象工厂模式组成:

  1. AbstractFactory:抽象工厂
  2. ConcreteFactory:具体工厂
  3. AbstractProduct:抽象产品(多个)
  4. Product:具体产品

优点:

  1. 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
  2. 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。
  3. 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点:

  1. 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
  2. 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。

适用环境:

  1. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
  2. 系统中有多于一个的产品族,而每次只使用其中某一产品族。
  3. 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
  4. 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

总结:

无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

更多精彩Android技术可以关注我们的微信公众号,扫一扫下方的二维码或搜索关注公共号: Android老鸟


这里写图片描述

0 0
原创粉丝点击