2 创建型模式-----工厂方法模式

简单工厂模式的不足:加入新产品的同时需要修改工厂类,违背“开闭原则”。

模式动机:增加一个抽象工厂类,再定义具体工厂类来生产具体的产品,增加新产品时只需要添加产品类和对应的具体工厂类即可。由于我们是对抽象工厂进行编程,因此可以在不修改抽象工厂的前提下增加新产品。

模式定义:工厂方法模式(Factory Method Pattern)又称工厂模式、虚构造器。该模式下,抽象工厂负责创建产品的公共接口,具体工厂继承自该接口来具体生产产品,这样就相当于将产品的实例化延迟到工厂子类中完成。

模式结构图:

模式实例:

假设一个电视机生产商需要生产Haier和Hisense两种电视机,那么需要:

1>  建立一个TVFactory抽象工厂负责提供生产电视机的接口;

2>  分别建立生产Haier和Hisense两种电视机的子工厂HaierTVFactory和HisenseTVFactory;

3>  建立抽象电视机接口TV;

4>  建立具体电视机HaierTV和HisenseTV实现这个TV接口

然后生产商只需要与抽象接口TVFactory与TV交互就可以了,如果在增加一个电视机种类,则分别加入对应的子类即可,无需更改抽象类,如此,很好地满足了“开闭原则”。其结构图如下:

模式代码:

bt_工厂方法模式.h:

 1 #ifndef FMP_H
 2 #define FMP_H
 3
 4 #include <iostream>
 5
 6 class TV                            // 定义电视机产品接口
 7 {
 8 public:
 9     virtual ~TV();
10     virtual void play() = 0;
11 };
12 TV::~TV(){ }
13
14 class HaierTV : public TV           // 具体的Haier电视机类
15 {
16 public:
17     virtual void play();
18 };
19 void HaierTV::play(){ }
20
21 class HisenseTV : public TV           // 具体的Hisense电视机类
22 {
23 public:
24     virtual void play();
25 };
26 void HisenseTV::play(){ }
27
28 /* *********************************************************************** */
29
30 class TVFactory                     // 定义抽象工厂
31 {
32 public:
33     virtual ~TVFactory();
34     virtual TV* produceTV() = 0;    // 生产电视机的接口
35 };
36 TVFactory::~TVFactory(){ }
37
38 class HaierTVFactory : public TVFactory     // 定义生产Haier电视机的工厂
39 {
40 public:
41     virtual TV* produceTV();
42 };
43 TV* HaierTVFactory::produceTV()             // 具体生产Haier电视机
44 {
45     std::cout << "生产了一台Haier电视机" << std::endl;
46     return new HaierTV;
47 }
48 
49 class HisenseTVFactory : public TVFactory     // 定义生产Hisense电视机的工厂
50 {
51 public:
52     virtual TV* produceTV();
53 };
54 TV* HisenseTVFactory::produceTV()             // 具体生产Hisense电视机
55 {
56     std::cout << "生产了一台Hisense电视机" << std::endl;
57     return new HisenseTV;
58 }
59
60 #endif // FMP_H

bt_工厂方法模式.cpp:

 1 #include <iostream>
 2 #include "bt_工厂方法模式.h"
 3
 4 using namespace std;
 5
 6 int main()
 7 {
 8     // 客户端生产电视机时只需和抽象工厂与抽象电视机交互即可
 9     TVFactory* factory;
10     factory = new HaierTVFactory;   // Haier工厂
11     TV* tv;
12     tv = factory->produceTV();         // 多态调用
13
14     factory = new HisenseTVFactory;  // Hisense工厂
15     tv = factory->produceTV();
16 
17     delete factory;
18     delete tv;
19
20     return 0;
21 }

模式优缺点:

  • 客户创建具体产品时只需和具体工厂打交道,无需关注产品创建细节;在系统中加入新产品时,只需添加产品类和具体工厂类,无需修改抽象工厂与抽象产品类,而这就意味着无需修改与用户接口,系统扩展性提高,符合“开闭原则”。
  • 缺点是每次增加一个新产品需要添加两个具体类,如果产品种类很多,系统就会变得臃肿。
时间: 2024-08-30 04:28:47

2 创建型模式-----工厂方法模式的相关文章

java语言实现创建型设计模式—工厂方法模式

一.描述 基于简单工厂模式中将所有类的创建和初始化放在一个工厂类中出现的问题,我们引进了工厂方法模式,该模式是GoF总结的23种设计模式的第一种,这个设计模式将一个工厂类拆分成多个具体的工厂类,每个具体的工厂类负责相应的类的对象的创建. 在工厂方法模式中,抽象工厂类负责定义创建对象的接口,具体对象的创建由实现该抽象工厂的具体工厂类来完成,它由四部分组成:抽象工厂类.实现抽象工厂类的具体工厂类.抽象类.实现抽象类的具体类. 二.工厂方法模式的优缺点 优点:在工厂方法模式中,创建对象的任务由具体的工

Java设计模式(创建型:工厂方法模式+抽象工厂模式)

设计模式根据目的准则可以分为三类: 创建型:creational 创建型的设计模式与对象的创建有关. 结构型:Structural 处理类和对象之间的组合. 行为型:behavioral 描述类和对象如何交互及如何分配职责. 工厂方法模式 站在使用者的角度,工厂方法模式是指使用者提出想要实现的具体功能或者说是想要生产的具体的东西的要求,在通过工厂制造之后就将该东西或功能交付给使用者.使用者并不知道实现的具体过程,只是做了要求提出以及实现的结果的使用. 严谨来说工厂方法模式(Factory Met

Java设计模式(创建型:工厂方法模式)

(该文内容为原创,有不足之处望多多指教!) 设计模式根据目的准则可以分为三类: 创建型:creational 创建型的设计模式与对象的创建有关. 结构型:Structural 处理类和对象之间的组合. 行为型:behavioral 描述类和对象如何交互及如何分配职责. 工厂方法模式是什么? 站在使用者的角度,工厂方法模式是指使用者提出想要实现的具体功能或者说是想要生产的具体的东西的要求,在通过工厂制造之后就将该东西或功能交付给使用者.使用者并不知道实现的具体过程,只是做了要求提出以及实现的结果的

PYTHON设计模式,创建型之工厂方法模式

我感觉和上一个差不多,可能不要动最要的地方吧... #!/usr/bin/evn python #coding:utf8 class Pizza(object): def prepare(self, type): print 'prepare {type} pizza'.format(type=type) def bake(self, type): print 'bake {type} pizza'.format(type=type) def cut(self, type): print 'cu

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

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

简单工厂模式\工厂方法模式

工厂模式 一.本节目标 我们本节课程主要介绍[工厂模式]的相关知识,将会涉及以下内容: 什么是工厂模式 工厂模式类图 工厂模式代码 工厂模式应用 PS:学习 Java 设计模式之前最好有一定的 Java 语言基础.由于讲这种东西其实比较枯燥,为了让大家学习起来轻松愉快一点,我会尽量使用一些生动.形象和幽默的例子. 二.什么是工厂模式 工厂模式(Factory Pattern)的意义就跟它的名字一样,在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象.工厂模式根据不同的参数来实现不同的分配

大话设计模式之简单工厂模式&amp;工厂方法模式&amp;抽象工厂模式

创造类模式分为三种:简单工厂模式,工厂模式和抽象工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口,让子类决定实例化哪一个类,讲一个类的实例化 延迟到其子类. 抽象工厂模式:为创建一组相关或相互依赖的对象的类,而不指定具体类. 结构图: 这是简单工厂的结构图,从图中就很好理解. 简单工厂的优点: 根据用户需要,new出需要的对象. 但是简单工厂弊端: 当新加入一个功能是,就要修改工厂.这个时候,就需要工厂模式了. 从图中我们可以看出: 工厂模式

Java的23中设计模式--工厂方法模式(Factory Method)

1.普通工厂模式 工厂类 /** * @Title Factory.java * @Package factory.factory1 * @date 2015-1-22 上午10:16:02 * @version V1.0 */ package factory.factory1; /** * @ClassName Factory * @date 2015-1-22 上午10:16:02 */ public class Factory { public Sender procedure(Strin

第4章 创建型模式—工厂方法模式(2)

2. 工厂方法模式 2.1工厂方法模式的定义 (1)定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类 ①Product:定义了工厂方法创建对象的接口.也就是实际需要使用的产品对象的接口 ②ConcreteProduct:具体的Product接口的实现对象. ③Factory(Creator):定义了工厂方法的抽象类并返回一个产品对象. ④ConcreteCreator:具体的创建器对象,该类实现和覆盖了父工厂类声明的方法.返回一个具体的Product实例

创建型模式 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

说起模式来大家都很头疼.大篇的介绍和概念,还有类图.. 一 简单工厂模式不属于23中涉及模式,简单工厂一般分为:普通简单工厂.多方法简单工厂.静态方法简单工厂. 简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.它又称为静态工厂方法模式,属于类的创建型模式. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 普通简单工厂  多方法简单工厂 静态方法简单工厂 class SimpleFacto