首页 > 抽象工厂模式AbstractFactory

抽象工厂模式AbstractFactory

简介

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

不同点

为了更清晰地理解抽象工厂模式,需要先引入两个概念:

产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是CPU,其子类有intelcpu、amdcpu,则抽象cpu与具体品牌的cpu之间构成了一个产品等级结构,抽象cpu是父类,而具体品牌的cpu是其子类。

产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如intel工厂生产的intelcpu、intel主板,intelcpu位于cpu产品等级结构中,intel主板位于主板产品等级结构中。

 

 

在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。

 

 

当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。

抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。

抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。

 

类图

 

源码

cpu

public interface CPU {public void calculate();
}

 

intelcpu

public class IntelCPU implements CPU {private Integer pins;//cpu脚针数public IntelCPU(Integer pins) {this.pins = pins;}public void calculate() {System.out.println("Intel CPU 脚针数:" + pins);}
}

 

amdcpu

public class AMDCPU implements CPU {private Integer pins;//cpu脚针数public AMDCPU(Integer pins) {this.pins = pins;}public void calculate() {System.out.println("AMD CPU 脚针数:" + pins);}
}

 

主板

public interface MainBoard {public void installCPU();
}

 

intel主板

public class IntelMainBoard implements MainBoard {private Integer pins;public IntelMainBoard(Integer pins) {this.pins = pins;}public void installCPU() {System.out.println("Intel MainBoard 针脚数:"+pins);}
}

 

amd主板

public class AMDMainBoard implements MainBoard {private Integer pins;public AMDMainBoard(Integer pins) {this.pins = pins;}public void installCPU() {System.out.println("AMD MainBoard 针脚数:" + pins);}
}

 

工厂

public interface AbstractFactory {public CPU buyCPU();public MainBoard buyMainBoard();}

 

intel工厂

public class IntelFactory implements AbstractFactory {public CPU buyCPU() {return new IntelCPU(555);}public MainBoard buyMainBoard() {return new IntelMainBoard(555);}
}

 

amd工厂

public class AMDFactory implements AbstractFactory {public CPU buyCPU() {return new IntelCPU(666);}public MainBoard buyMainBoard() {return new IntelMainBoard(666);}
}

 

商家

public class Store {private CPU cpu = null;private MainBoard mainBoard = null;//组装pcpublic void setupPC(AbstractFactory factory) {this.cpu = factory.buyCPU();//买cputhis.mainBoard = factory.buyMainBoard();//买主板//买内存 机箱...this.cpu.calculate();this.mainBoard.installCPU();}
}

 

测试

    public static void main(String[] args) {Store store = new Store();AbstractFactory intelModel = new IntelFactory();store.setupPC(intelModel);//intel型号的电脑
/*        Intel CPU 脚针数:555Intel MainBoard 针脚数:555*/}

 

适用场景

  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
  • 这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
  • 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。(比如:Intel主板必须使用Intel CPU、Intel

芯片组)

  • 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

优点

  • 分离接口和实现:客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
  • 使切换和添加产品族变得容易:因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从Intel系列到AMD系列只需要切换一下具体工厂。我也可以再添加一个新的装机方案,一个新的产品族,都是很方便的。

缺点

不容易扩展新的产品等级,比如我要加一个硬盘、内存什么的。那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。

 

Head First 设计模式(中文版)的示例:

码云地址:https://gitee.com/manusas/FactoryDP

 

我只是大自然的搬运工(thx):

hxxp://blog.csdn.net/zhshulin/article/details/38349211

hxxp://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html

转载于:https://www.cnblogs.com/manusas/p/7489893.html

更多相关:

  • 简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。 本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解。   简单工厂 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。...

  • 工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别:...

  • 又重头想了一下还是以配电脑为例最开始的时候,需要电脑,你得自己去生产电脑的每一个组件,例如你要cpu 就得自己生产cpu 要主板就得自己生产主板。于是出现 简单工厂模式在简单工厂模式中,定义一个返回接口,然后所有的组件实例都从这个工厂中产生例: 工厂---------生产硬件 硬件----------...

  •   产品相关知识可以在:http://www.aipingce.com/进行学习,本文转自:http://www.aipingce.com/article-22960-1.html 首先,我个人还是非常推荐大家看实体书的,原因如下,算是做个分析吧: 电子书是免费的,我也分享了很多,可以放在电脑、手机、pad上面看,但是通过我自己的体会...

  • 产品经理跪求程序员,程序员跪求程序成功上线! 前几天纯银V在微博上发了一条微博「很多人吐槽“人人都是产品经理”这句话,其实在我看来,这句话的正确理解是“人人都应该学习产品经理的思维方式,来提升自己的专业能力”,不知道作者是否本意如此。当然,实际上它容易被理解为“我也可以做产品经理,创造一个伟大的产品”,那就很扯淡了。尤其水货产...

  • 《程序员杂志》的文章,原帖位于http://www.programmer.com.cn/7760/ 写的很好,自己转贴存储一下,也符合Product Owner的要求,就是……要求太高了! 本文是他回顾自己二十多年来从事软件产品管理工作的总结和经验分享,谈到了招聘产品经理的标准,以及产品经理应该具备的特质。文 / Marty Caga...

  • 在.Net Framework中,配置文件一般采用的是XML格式的,.NET Framework提供了专门的ConfigurationManager来读取配置文件的内容,.net core中推荐使用json格式的配置文件,那么在.net core中该如何读取json文件呢?1、在Startup类中读取json配置文件1、使用Confi...

  •   1 public class FrameSubject extends JFrame {   2    3   …………..   4    5   //因为无法使用多重继承,这儿就只能使用对象组合的方式来引入一个   6    7   //java.util.Observerable对象了。   8    9   DateSub...

  • 本案例主要说明如何使用NSwag 工具使用桌面工具快速生成c# 客户端代码、快速的访问Web Api。 NSwagStudio 下载地址 比较强大、可以生成TypeScript、WebApi Controller、CSharp Client  1、运行WebApi项目  URL http://yourserver/swagger 然后...

  •   在绑定完Action的所有参数后,WebAPI并不会马上执行该方法,而要对参数进行验证,以保证输入的合法性.   ModelState 在ApiController中一个ModelState属性用来获取参数验证结果.   public abstract class ApiController : IHttpController,...

  • 1# 引用  C:AVEVAMarineOH12.1.SP4Aveva.ApplicationFramework.dll C:AVEVAMarineOH12.1.SP4Aveva.ApplicationFramework.Presentation.dll 2# 引用命名空间, using Aveva.Applicati...