工厂方法模式提供的是对一个产品的等级模式,,而抽象工厂方法提供的是对多个产品的等级模式,注意,这里的多个具体产品之间是相互耦合的,也就是说这里的抽象工厂提供的产品之间是存在某种联系的。
有人做如下的比较:
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
下面是一个形象的比喻:
无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,
将可变的部分留作接口,以达到最大程度上的复用。
拿一个生产水杯(cup)的工厂举例:
起初,不用工厂模式,我必须在生产水杯之前知道水杯的材料和形状等水杯的所有特征才能生产,
这就是我们的new Cup();这个Cup必须是具体的。
厂主发现同一形状的被子,只是材料不同,如一个是玻璃(glass)的,一个是瓷(china)的,
但是确要两条生产线,显然有资源浪费的嫌疑。现在厂主生产杯子时先不让生产线知道我要产的
是玻璃的还是瓷的,而是让它在不知道具体材料的情况下先做它能做的,等到它把模具做好,
只需要向其中填充玻璃原料或者瓷原料就可以造出同一形状的具体杯子了。
但是很可惜,java并不能new一个抽象的Cup,所以就有了简单工厂模式。
原来是Cup cup=new Cup;
现在是SimpleCupFactory.createCup(String cupName),
根据cup的名字生产Cup,
而createCup返回的是一个实现了 Cup接口或抽象类的具体Cup。
简单抽象工厂模式有一个问题,就是当我现在想生产一个同样形状的铁杯时,
工厂里并没有定义相应的处理流程,只能更改createCup方法,这就不合理了。
我现在只是想生产铁杯,你只要在最后的时候把玻璃原料换成铁的不就行了吗,
干嘛还要更改整条生产线呢?于是就有了工厂模式。
原来生产线在生产模具的时候还要考虑是为玻璃杯生产的模具还是为铁杯生产的模具,现在它不用管了。
CupFactory.createCup()创建Cup.CupFactory是接口或抽象类。
实现它的具体子类会创建符合Cup接口的具体Cup。
那么现在厂主想要生产水壶(kettle),用工厂模式就不得不再造一条水壶生产线,
能不能在水杯生产线同时生产水壶呢?这就是抽象工厂模式。
分享到:
相关推荐
4.简单工厂-工厂方法-抽象工厂 对比总结
介绍的是工厂模式 包括简单工厂模式、工厂方法模式、抽象工厂模式 包括PPT和代码
工厂方法模式和抽象工厂模式的区别,对工厂方法模式和抽象工厂模式做了简单的比较
本文章通俗易懂的对工厂模式进行了讲解,相信您看完这篇文章会对工厂模式有更深入的了解
设计模式之工厂方法、简单工厂、抽象工厂
NULL 博文链接:https://1193355343.iteye.com/blog/2370838
1、抽象工厂模式+反射技术 2、抽象工厂模式+简单工厂模式 3、仅仅是抽象工厂模式
通过抽象类中的抽象方法实现简单工厂模式。
从简单工厂,到工厂方法到抽象工厂,这几种都带有“工厂”的模式,总是容易叫人迷糊,我仔细研究了下,然后用简单的例子做类比,列出了自己的通俗理解和比较,大部分是自己的体会,感觉理的比较清楚,末尾提了下...
c#工厂模式 简单工厂,抽象工厂,单件模式
NULL 博文链接:https://mrpengpengda.iteye.com/blog/1536290
这是代码,介绍请查看以下博客地址: http://www.cnblogs.com/homg/p/3548110.html代码乱码请使用utf-8编码。
工厂模式在一些设计模式的书中分为简单工厂模式,工厂方法模式和抽象工厂模式三类。也有把工厂方法模式划分到抽象工厂模式的,认为工厂方法是抽象工厂模式的特例的一种,就是只有一个要实现的产品接口。
设计模式中工厂相关模式有简单工厂、工厂方法、抽象工厂学习后的练习代码,C++编程语言。
c#工厂模式——简单工厂_抽象工厂实例
C++ 工厂模式 (简单工厂、工厂和抽象工厂)
通过C++实现了简单工厂模式、工厂模式、抽象工厂模式三大设计模式的经典案例。
* 在工厂方法的基础上,进一步抽象工厂类,将工厂抽象成两层,AbsFactory(抽象工厂) 和具体实现工厂子类。 * 调用者根据创建对象类型使用对应的工厂子类。 * 这样将单个的简单工厂类变成了工厂簇, 利于代码的维护...
本资源主要介绍工厂方法模式和抽象工厂模式。二者都与工厂相关,,但是其本质又大相径庭。这里先来简单介绍下二者的区别,以免混淆。 抽象工厂模式:提供一个接口,用于创建一系列相关的对象,而无需指定具体的类。...
用反射机制改进的抽象工厂