简单工厂模式、工厂模式、抽象工厂模式(学习笔记)

原创 2012年03月29日 08:29:44

弄清楚在什么场合下该使用怎样的设计模式才是最重要的

                                                                                                                           ——谨记

1 简单工厂模式:

     适用场合(个人理解)

我们有属于某一个类型的许多类(可能是实现同一接口的一些类,也可能是继承同一父类),只有在运行时才能确定出该实例化哪一个(或者说,你希望灵活的在运行中创建),这时候,我们就可以使用简单工厂模式。简单工厂模式,就是在运行期间根据情况,创建出相应的类的对象。

对应的uml图

      

图1.1  简单工厂uml图(1

         解释: Product1、Product2、Product3是虚基类Product的子类(当然可以有更多子类),Client需要在运行时决定应该创建哪一个子类,这时,Client依靠SimpleFactory的createProduct(String product)方法来动态创建所需要的类。createProduct(Stringproduct)很好实现,如上图,只要使用if..else..语句就可以了。

         为了节省资源,createProduct方法通常定义为静态方法,或者,将SimpleFactory写成单例模式。由于在子类中,静态方法是不可以被重载的,而单例模式由于构造函数是私有的,不能被继承(2)。所以,如果增加了产品(也就是Product的子类),不得不修改createProduct方法,这违法了开闭原则,这也是简单工厂模式最大的弊病。

        可以利用反射机制:return  Class.forName(product).newInstance();

         ※注1:Product也可以使=是一个接口,对应Product1、Product2、Product3实现这个接口。

※注2:单例模式的构造函数也可以定义为protected,在Java中必须注意防止同包内的其他类构造这个单例。但是即便如此,应用单例模式时,很少创建子类。

2 工厂模式:

     有些网站、书中将工厂模式看做是简单工厂模式的升级版,我却怎么想也想不明白,因为我觉得,这两个模式完全是应用在不同的场景。

适用场合(个人理解)

工厂模式非常好的体现了依赖倒置原则,即A:高层模块不应该依赖于底层模块,都应该依赖抽象。B:抽象不应该依赖于细节,细节应该依赖于抽象。

假设:你在开发一个工程,采取的是自上而下的分析方法。你确定了两个上层的抽象类:Creator和Product,其关系为Creator需要创建并使用Product类。很显然Product是抽象类嘛,在Create中,你无法创建(3)Product类。这时你就可以使用工厂模式来解决这个问题,uml图如下:


图2.1 工厂模式uml图(4

解释:这里面注意的就是Creator定义了一个抽象方法,而在其某一个成员方法anOperator就用到了这个方法。这样,Creator类就可以“创建”Product的对象了。而真正的创建方法,在其子类中实现。也就是我们看到很多书中说的,工厂模式把某一个类的实例化延迟到了子类。

工厂模式的好处,一则没有违法依赖倒置原则,减少了代码维护的压力。同时,Creator与Product建立了逻辑上的关联,也就是这两个类在抽象的层次上建立了关联。起到了代码复用的作用,减少了开发工作量。反过来看,在Creator类与Product存在这样的“创建并使用”的关系时,可以使用工厂模式。

※注3也不要试图在Create中就创建Product的子类,这样违反依赖倒置原则,导致抽象的Create依赖于Product的具体子类。

※注4根据情况,product自然也可以是接口,对应ConcreteProduct实现这个接口。

3 抽象工厂模式:

     我不得不说,抽象工厂模式,稍微有些复杂。

适用场合(个人理解)

与工厂模式对比来说:

1.     有多个产品(Product),其实,工厂模式,也可以由多个产品。

2.     这些产品的子类(或者是实现接口的类)分成了两个或多个系列。

3.     我们希望在客户端中,使用同一个系列的产品。

这时候,我们就可以使用抽象工厂模式了。uml图如下:

 

图3.1  抽象工厂模式uml图

         解释:

         多个产品:AbstractProductA、AbstractProductB;

         两个系列:系列1:ProductA1、ProductB1;

                            系列2:ProductA2、ProductB2;

         与工厂模式类似,这里的AbstractFactory相当于上个UML图中的Creator,AbstractFactory 将产品对象的创建延迟到其ConcreteFactory。不同的是,每个具体的类创建一系列的产品。客户端(Client)使用一个特定的ConcreteFactory类,强制的使用了同一系列的产品。

 

 


简单工厂模式、工厂方法模式、抽象工厂模式 之间的对比

简单工厂模式、工厂方法模式、抽象工厂模式 之间的对比
  • u013761036
  • u013761036
  • 2016年06月23日 20:10
  • 1044

【JS设计模式】温习简单工厂模式、工厂方法模式、抽象工厂模式概念

简单工厂模式(Simple Factory Pattern): 使用一个类(通常为单体)来创建实例;简单工厂模式也叫静态工厂方法模式(Static FactoryMethod Pattern). 工...
  • itpinpai
  • itpinpai
  • 2016年04月15日 18:30
  • 6745

简单工厂模式和抽象工厂模式的通俗理解

 以造汽车为例来通俗的说一下:(写的不好或有错误的地方欢迎大家指正)汽车制造商要造汽车卖给客户,那应该如可来做?看下面:     第一:汽车制造商要知道客户要什么样的汽车,即设计汽车;   第二:设计...
  • chenxsh2615
  • chenxsh2615
  • 2007年06月01日 20:02
  • 2709

iOS 简单工厂模式、抽象工厂模式~详解

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄 /**     注意:简单工厂模式示例代码下载地址, */ 一、简单工厂模式 1、简述 首先...
  • shihuboke
  • shihuboke
  • 2017年06月29日 17:59
  • 314

浅谈 简单工厂模式,工厂方法模式,抽象工厂模式的优点和缺点

1.简单工厂模式: 简单工厂模式的实质是由一个工厂类根据传入的参数 动态决定应该创建出哪一个产品类的实例 工厂类角色,抽象产品角色,具体产品角色 严格说这并不是一个设计模式,简单...
  • li_yaya
  • li_yaya
  • 2012年04月08日 20:06
  • 2582

结合Java反射用简单工厂模式改进抽象工厂模式

前一篇简单介绍了抽象工厂模式,结合Java的反射机制,可以用简单工厂模式来改进抽象工厂模式,减少类的数量,增加可维护性。UML图如下: 去除IFactory、SqlserverFacto...
  • sdauzxl
  • sdauzxl
  • 2016年08月20日 12:01
  • 1009

动态代理,工厂模式和反射技术

用一个工厂模式实现对业务类A和B的调用,其中使用反射和动态代理1.首先定义个借口类:public interface MyInter { public int add(int min,int ma...
  • baitiandeye
  • baitiandeye
  • 2010年07月27日 22:51
  • 1816

Unity3d之设计模式(二)工厂模式

这个系列的文章,并不会将所有用到的设计模式全部讲一遍,事实上我个人认为,并不是所有的设计模式都适用于Unity3D。这里讲的主要还是一些常用的设计模式。 那么,本章讲的就是常见的构建型模式当中的工厂...
  • qq563129582
  • qq563129582
  • 2016年12月15日 13:08
  • 1413

策略模式及与简单工厂模式的结合

策略模式: 1.策略模式动机:完成一项任务有多种不同的方式,每一种方式称为一种策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。 在软件开发中常常遇到这种情况:实现某一功能有多种途...
  • ustcqi
  • ustcqi
  • 2012年12月19日 15:03
  • 2309

抽象工厂模式和工厂方法模式区别

首先来看看这两者的定义区别: 工厂模式:定义一个用于创建对象的借口,让子类决定实例化哪一个类 抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类        个...
  • liu88010988
  • liu88010988
  • 2016年03月04日 09:48
  • 3615
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单工厂模式、工厂模式、抽象工厂模式(学习笔记)
举报原因:
原因补充:

(最多只允许输入30个字)