工厂模式在《Java与模式》中分为三类:
1)简单工厂模式(Simple Factory):不利于产生系列产品;

2)工厂方法模式(Factory Method):又称为多形性工厂;

3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品;
             这三种模式从上到下逐步抽象,并且更具一般性。
             GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

二、简单工厂模式

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。


在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。
先来看看它的组成:

1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

三、工厂方法模式


工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。
  来看下它的组成:

1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
       工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品(即暴发户的汽车)产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代 码。可以看出工厂角色的结构也是符合开闭原则的!

代码:

 1 //抽象产品角色
 2 public interface Moveable {
 3     void run();
 4 }
 5 //具体产品角色
 6 public class Plane implements Moveable {
 7     @Override
 8     public void run() {
 9         System.out.println("plane....");
10     }
11 }
12
13 public class Broom implements Moveable {
14     @Override
15     public void run() {
16         System.out.println("broom.....");
17     }
18 }
19
20 //抽象工厂
21 public abstract class VehicleFactory {
22     abstract Moveable create();
23 }
24 //具体工厂
25 public class PlaneFactory extends VehicleFactory{
26     public Moveable create() {
27         return new Plane();
28     }
29 }
30 public class BroomFactory extends VehicleFactory{
31     public Moveable create() {
32         return new Broom();
33     }
34 }
35 //测试类
36 public class Test {
37     public static void main(String[] args) {
38         VehicleFactory factory = new BroomFactory();
39         Moveable m = factory.create();
40         m.run();
41     }
42 }

可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。因为如果不能避免这种情 况,可以考虑使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实 现。

四、简单工厂和工厂方法模式的比较

工厂方法模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来, 从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。 
反过来讲,简单工厂模式是由工厂方法模式退化而来。设想如果我们非常确定一个系统只需要一个实的工厂类, 那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。

五、抽象工厂模式

代码:
 1 //抽象工厂类
 2 public abstract class AbstractFactory {
 3     public abstract Vehicle createVehicle();
 4     public abstract Weapon createWeapon();
 5     public abstract Food createFood();
 6 }
 7 //具体工厂类,其中Food,Vehicle,Weapon是抽象类,
 8 public class DefaultFactory extends AbstractFactory{
 9     @Override
10     public Food createFood() {
11         return new Apple();
12     }
13     @Override
14     public Vehicle createVehicle() {
15         return new Car();
16     }
17     @Override
18     public Weapon createWeapon() {
19         return new AK47();
20     }
21 }
22 //测试类
23 public class Test {
24     public static void main(String[] args) {
25         AbstractFactory f = new DefaultFactory();
26         Vehicle v = f.createVehicle();
27         v.run();
28         Weapon w = f.createWeapon();
29         w.shoot();
30         Food a = f.createFood();
31         a.printName();
32     }
33 }

在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。

六、总结。

(1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。 
(2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。 
(3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。

转自:http://www.cnblogs.com/forlina/archive/2011/06/21/2086114.html

工厂模式——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...相关推荐

  1. 设计模式学习笔记(三)工厂模式中的简单工厂、工厂方法和抽象工厂模式之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  2. 工厂模式(简单工厂、工厂方法、抽象工厂)

    简单工厂模式 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决 ...

  3. 工厂模式(简单工厂,工厂方法,抽象工厂)

    工厂顾名思义就是创建产品,工厂分为三种:简单工厂,工厂方法,抽象工厂.该模式用于封装和管理对象的创建,是一种创建型模式. 1)简单工厂 该模式通过向工厂传递类型来指定要创建的对象 提供一个方法,根据类 ...

  4. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

  5. 23招做项目——工厂模式:工厂方法和抽象工厂

    在网上的大多数资料里面,将工厂模式分为:简单工厂.工厂方法.抽象工厂,他们之间的联系(以电子厂为例)如下: 那么该文章首先讲解工厂模式是什么,为什么需要工厂模式,最后再对三种模式进行示例.该文章是23 ...

  6. 设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  7. 设计模式:工厂方法与抽象工厂模式

    说明:这篇blog写的很好,有助于理解工厂方法与抽象工厂模式的联系与区别. 原文链接:http://blog.csdn.net/yzxz/article/details/4601152 抽象工厂模式与 ...

  8. 工厂方法与抽象工厂模式的区别

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

  9. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  10. java 抽象工厂工厂_Java设计模式之简单工厂、工厂方法和抽象工厂

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:456544752我们一起学Java! 在前面的学习中(参见前面的博客),我们学到了很 ...

最新文章

  1. 禁止直接在浏览器输入网址访问的代码
  2. ajax使用异步问题
  3. python里有常量吗?(没有,但可自行定义)
  4. 《剑指offer》字符串的排列
  5. C++-实现日志log功能
  6. java validate 框架_如何使用validator框架来validatebean
  7. 《流畅的Python》读书笔记——符合Python风格的对象
  8. 计算给定坐标系和各个定点坐标的凸多边形的面积
  9. html canvas 简单体验
  10. java方法 将123转换成 “一百二十三”
  11. 家里宽带628连不上_宽带连接错误628连接被远程计算机终止是什么意思 - 卡饭网...
  12. linux如何生成tgz文件,linux – 压缩文件夹以创建tgz文件
  13. 单克隆抗体WuT9/甘草次酸-氟尿嘧啶偶联顺铂/RGD肽修饰聚谷氨酸-顺铂复合物的制备
  14. Swift - 视频录制教程3(设置拍摄窗口大小,录制正方形视频)
  15. 干货|人脸识别技术基础知识,看这里
  16. 2020移动apn接入点哪个快_移动水上乐园里的充气水池和支架水池,哪个回本快?...
  17. Windows10企业英文版下载 2022-2-17更新
  18. Fiddler 抓包下载 M3U8 视频
  19. HTML Input输入框自定义required的提示内容(默认值:请填写此字段)
  20. win10升级win11后笔记本电脑充不了电解决方法

热门文章

  1. axis1 c# 接口 调用_java调用c#的Webservice接口数据报错
  2. php织梦,帝国,帝国 织梦 php
  3. php基础编程教程 pdf,手把手教你编程打印出PDF_PHP教程
  4. mui刷新不显示动画_144Hz刷新率和60Hz有啥区别?体验有何不同?这里全告诉你
  5. mysql 排名_SQL语句mysql排名、分组后组内排名、取各组的前几名
  6. android代码跳过锁屏,Android_android禁止锁屏保持常亮(示例代码),在播放video的时候在mediaplayer m - phpStudy...
  7. oracle只有oradata恢复,如何恢复一个只有完好数据文件的数据库?
  8. java 企业级应用设计规范_一步一步理解Java 企业级应用的可扩展性
  9. action链接html,如何使用@ html.actionlink删除链接文本
  10. java stream 泛型