设计模式之静态工厂、工厂方法和抽象工厂的联系与区别

解析:

开闭原则:对扩展开放,对修改封闭。静态工厂增加需要是修改源代码,对修改不封闭,不符合开闭原则。



Simple Factory 简单工厂模式(静态工厂)

1)Simple Factory模式属于创建型模式

2)简单工厂模式是由一个工厂(注意是一个!)对象决定创建出哪一种产品类的实例(例如你到肯德基说你要鸡腿,要薯条,要饮料还是其他的,这时肯德基是一个工厂,客户端只需要点明自己要什么就行)

3)实现方式的实质:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

UML类图如下:

分析:

工厂角色:被客户端直接调用,根据客户端指定传入的参数,动态创建客户端需要的对象;

抽象产品角色:所有对象的父类(接口);

具体产品角色:即工厂的创建目标,工厂创建的对象就是这些具体类的对象。

可以看出,客户端只面对工厂,不用管产品的具体细节,客户只需向工厂要求你需要什么,其他的事情都交给工厂了。



优点:
通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利。(简单地说,你到肯德基去只需要说你要鸡腿还是鸡翅就行了,不需要去管鸡腿和鸡翅是怎么做出来的,工厂为你提供了这样一个界面)。

不足:
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;



使用场景

工厂类负责创建的对象比较少;   

客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;  

由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

从上面的例子也可以看出来,工厂类往往是用反射机制来产生具体对象的。(因为不同类都继承自同一接口),故其扩展性很有限,产品种类必须是事先就知道的哪几种,什么时候你想要添加一个不是公共接口下的具体类就不行了。

另外,如果你不用反射机制,也不要公共接口,在工厂中使用其他逻辑(例如判断传入的字符串)来根据用户参数创建对象也行,那样扩展性也是很糟糕的,逻辑和添加只会越来多。



工厂方法模式

UML类图如下:

这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂。

好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。

缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。



Abstract Factory 抽象工厂

UML类图如下:

参与者

AbstractFactory——声明一个创建抽象产品对象的操作接口
ConcreteFactory——实现创建具体产品对象的操作
AbstractProduct——为一类产品对象声明一个接口
ConcreteProduct
① 定义一个将被相应的具体工厂创建的产品对象
② 实现AbstractProduct接口

Client
① 仅使用由AbstractFactory和AbstractProduct类声明的接口

协作

① 通常在运行时刻创建一个ConcreteFactory类的实例。这一具体的工厂创建具有特定实现的产品对象。为创建不同的产品对象,客户应适用不同的具体工厂。

②AbstractFactory将产品对象的创建延迟到它的ConcreteFactory子类。



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

抽象工厂模式:① 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
       ② 一个抽象工厂类,可以派生出多个具体工厂类。
       ③ 每个具体工厂类可以创建多个具体产品类的实例。

区别:① 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
   ② 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
   


时间: 2024-10-24 12:31:23

设计模式之静态工厂、工厂方法和抽象工厂的联系与区别的相关文章

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

[本文转自简单工厂.工厂方法.抽象工厂.策略模式.策略与工厂的区别] 结合简单示例和UML图,讲解工厂模式简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上 Audi后他说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们

简单工厂、工厂方法、抽象工厂模式

           最近一直再将设计模式,于是趁热打铁,对这三种设计模式做一个总结.           首先我先用一句话总结一下这三个模式:简单工厂是一个工厂只能造一种奔驰,工厂方法是一个工厂可以造多种车,比如劳斯莱斯.奥迪等,而抽象工厂是说工厂不光可以造越野式奔驰,还可以造家用式奔驰.还有商用式奔驰.            那么究竟简单工厂是什么呢?为什么它不是23的设计模式中的一个?            用一个类图和一段代码我们来解释一下:                      

设计模式:工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)

 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 分类  工厂模式主要是为创建对象提供过渡接口,以便将创建对象的

Java设计模式编程中的工厂方法模式和抽象工厂模式_java

工厂方法模式 动机 创建一个对象往往需要复杂的过程,所以不适合包含在一个复合工厂中,当有新的产品时,需要修改这个复合的工厂,不利于扩展. 而且,有些对象的创建可以需要用到复合工厂访问不到的信息,所以,定义一个工厂接口,通过实现这个接口来决定实例化那个产品,这就是工厂方法模式,让类的实例化推迟到子类中进行. 目的 1. 定义一个接口,让子类决定实例化哪个产品. 2. 通过通用接口创建对象. 实现 1. 产品接口和具体产品很好理解. 2. 工厂类提供一个工厂方法,返回一个产品对象.但是这个工厂方法是

设计模式C#描述——抽象工厂模式

设计 设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构.那么为了将消费这些产品对象的责任和创建这些产品对象的责任分开,可以引进抽象工厂模式.这样的话,消费产品的客户不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品. 采用抽象工厂模式设计出的系统类图如下. 从上图可以看到,抽象工厂模式设计到以下的角色: 抽象工厂

Java设计模式编程中简单工厂与抽象工厂模式的使用实例_java

简单工厂模式类图 通过一个工厂类,以一个条件来创建对应的对象 //业务功能 public interface ICalculation { double getResult(double numA, double numB); } public class CalcAdd implements ICalculation { @Override public double getResult(double numA, double numB) { System.out.println("加法&qu

设计模式系列之三:抽象工厂模式

前言 在设计模式有三个模式是与工厂模式相关的,分别是:简单工厂模式.工厂方法模式以及抽象工厂模式.在前面的文章中已经谈到前面两种,这里就对抽象工厂模式介绍一下.抽象工厂模式就是提供一个创建一系列相关或者相互依赖的接口(也就是抽象类),而无需指定具体的类.简单来说,就是当我们需要创建一个具体的对象的时候,我们不必指定该具体的对象,只需要使用它的上层接口直接调用就行.好像还是很抽象哦,好吧,为了更清晰领悟这个设计模式,我们还是通过一个案例来说明 问题背景 某公司开发了一个A软件,数据库使用的是SQL

Java技术_每天掌握一种设计模式(004)_使用场景及简单实例(创建型:抽象工厂)

Java技术_每天掌握一种设计模式(001)_设计模式概念及分类 Java技术_每天掌握一种设计模式(002)_使用场景及简单实例(创建型:单例模式) Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法) Java技术_每天掌握一种设计模式(004)_使用场景及简单实例(创建型:抽象工厂) Java技术_每天掌握一种设计模式(005)_使用场景及简单实例(创建型:建造模式) Java技术_每天掌握一种设计模式(006)_使用场景及简单实例(创建型:原型模式) 1.

PHP设计模式——抽象工厂

      声明:本系列博客参考资料<大话设计模式>,作者程杰.         前面我们介绍了简单工厂和工厂方法设计模式,今天我们学习最后一个工厂--抽象工厂.         案例:追MM少不了请吃饭了,去麦当劳,只管向服务员说"两个B套餐"就行了.麦当劳就是B套餐的AbstractFactory,B套餐里含有汉堡, 鸡翅和饮料. 麦当劳或肯德基会根据B套餐的规格, 让汉堡Factory, 鸡翅Factory,饮料Factory分别生产对应B套餐的材料.