设计模式C++实现(1)——工厂模式

该文章转载自: http://blog.csdn.net/wuzhekai1985

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍工厂模式的实现。

工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。听上去差不多,都是工厂模式。下面一个个介绍,首先介绍简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类。有点抽象,举个例子就明白了。有一家生产处理器核的厂家,它只有一个工厂,能够生产两种型号的处理器核。客户需要什么样的处理器核,一定要显示地告诉生产工厂。下面给出一种实现方案。

 1 enum CTYPE {COREA, COREB};
 2 class SingleCore
 3 {
 4 public:
 5     virtual void Show() = 0;
 6 };
 7 //单核A
 8 class SingleCoreA: public SingleCore
 9 {
10 public:
11     void Show() { cout<<"SingleCore A"<<endl; }
12 };
13 //单核B
14 class SingleCoreB: public SingleCore
15 {
16 public:
17     void Show() { cout<<"SingleCore B"<<endl; }
18 };
19 //唯一的工厂,可以生产两种型号的处理器核,在内部判断
20 class Factory
21 {
22 public:
23     SingleCore* CreateSingleCore(enum CTYPE ctype)
24     {
25         if(ctype == COREA) //工厂内部判断
26             return new SingleCoreA(); //生产核A
27         else if(ctype == COREB)
28             return new SingleCoreB(); //生产核B
29         else
30             return NULL;
31     }
32 };
33
34 //主函数测试简单工厂
35 int main(void)
36 {
37     Factory* factory = new Factory();
38     factory->CreateSingCore(COREA)->Show();
39     factory->CreateSingCore(COREB)->Show();
40 }

这样设计的主要缺点之前也提到过,就是要增加新的核类型时,就需要修改工厂类。这就违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。于是,工厂方法模式出现了。所谓工厂方法模式,是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

听起来很抽象,还是以刚才的例子解释。这家生产处理器核的产家赚了不少钱,于是决定再开设一个工厂专门用来生产B型号的单核,而原来的工厂专门用来生产A型号的单核。这时,客户要做的是找好工厂,比如要A型号的核,就找A工厂要;否则找B工厂要,不再需要告诉工厂具体要什么型号的处理器核了。下面给出一个实现方案。

 1 class SingleCore
 2 {
 3 public:
 4     virtual void Show() = 0;
 5 };
 6 //单核A
 7 class SingleCoreA: public SingleCore
 8 {
 9 public:
10     void Show() { cout<<"SingleCore A"<<endl; }
11 };
12 //单核B
13 class SingleCoreB: public SingleCore
14 {
15 public:
16     void Show() { cout<<"SingleCore B"<<endl; }
17 };
18 class Factory
19 {
20 public:
21     virtual SingleCore* CreateSingleCore() = 0;
22 };
23 //生产A核的工厂
24 class FactoryA: public Factory
25 {
26 public:
27     SingleCoreA* CreateSingleCore() { return new SingleCoreA; }
28 };
29 //生产B核的工厂
30 class FactoryB: public Factory
31 {
32 public:
33     SingleCoreB* CreateSingleCore() { return new SingleCoreB; }
34 };
35
36 //主函数测试工厂方法
37 int main(void)
38 {
39     FactoryA* factorya = new FactoryA();
40     factorya->CreateSingCore()->Show();
41     FactoryB* factoryb = new FactoryB();
42     factoryb->CreateSingCore()->Show();
43
44     return 0;
45 }

工厂方法模式也有缺点,每增加一种产品,就需要增加一个对象的工厂。如果这家公司发展迅速,推出了很多新的处理器核,那么就要开设相应的新工厂。在C++实现中,就是要定义一个个的工厂类。显然,相比简单工厂模式,工厂方法模式需要更多的类定义。

既然有了简单工厂模式和工厂方法模式,为什么还要有抽象工厂模式呢?它到底有什么作用呢?还是举这个例子,这家公司的技术不断进步,不仅可以生产单核处理器,也能生产多核处理器。现在简单工厂模式和工厂方法模式都鞭长莫及。抽象工厂模式登场了。它的定义为提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。具体这样应用,这家公司还是开设两个工厂,一个专门用来生产A型号的单核多核处理器,而另一个工厂专门用来生产B型号的单核多核处理器,下面给出实现的代码。

 1 //单核
 2 class SingleCore
 3 {
 4 public:
 5     virtual void Show() = 0;
 6 };
 7 class SingleCoreA: public SingleCore
 8 {
 9 public:
10     void Show() { cout<<"Single Core A"<<endl; }
11 };
12 class SingleCoreB :public SingleCore
13 {
14 public:
15     void Show() { cout<<"Single Core B"<<endl; }
16 };
17 //多核
18 class MultiCore
19 {
20 public:
21     virtual void Show() = 0;
22 };
23 class MultiCoreA : public MultiCore
24 {
25 public:
26     void Show() { cout<<"Multi Core A"<<endl; }
27
28 };
29 class MultiCoreB : public MultiCore
30 {
31 public:
32     void Show() { cout<<"Multi Core B"<<endl; }
33 };
34 //工厂
35 class CoreFactory
36 {
37 public:
38     virtual SingleCore* CreateSingleCore() = 0;
39     virtual MultiCore* CreateMultiCore() = 0;
40 };
41 //工厂A,专门用来生产A型号的处理器
42 class FactoryA :public CoreFactory
43 {
44 public:
45     SingleCore* CreateSingleCore() { return new SingleCoreA(); }
46     MultiCore* CreateMultiCore() { return new MultiCoreA(); }
47 };
48 //工厂B,专门用来生产B型号的处理器
49 class FactoryB : public CoreFactory
50 {
51 public:
52     SingleCore* CreateSingleCore() { return new SingleCoreB(); }
53     MultiCore* CreateMultiCore() { return new MultiCoreB(); }
54 };
55
56 //主函数测试抽象工厂
57 int main(void)
58 {
59     FactoryA* factorya = new FactoryA();
60     factorya->CreateSingleCore()->Show();
61     factorya->CreateMultiCore()->Show();
62     FactoryB* factoryb = new FactoryB();
63     factoryb->CreateSingleCore()->Show();
64     factoryb->CreateMultiCore()->Show();
65
66     return 0;
67 }

至此,工厂模式介绍完了。利用Rational Rose 2003软件,给出三种工厂模式的UML图,加深印象。

简单工厂模式的UML图:

工厂方法的UML图:

抽象工厂模式的UML图:

转载请标明出处 http://blog.csdn.net/wuzhekai1985

时间: 2024-10-30 04:28:34

设计模式C++实现(1)——工厂模式的相关文章

C#设计模式系列:简单工厂模式(Simple Factory)

1.简单工厂模式简介 1.1>.定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又称为静态工厂模式,Factory类为静态类或包含静态方法. 1.2>.使用频率  中 2.简单工厂模式结构 2.1>.结构图 2.2>.参与者 简单工厂模式参与者: ◊ Product:抽象产品类,将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中. ◊ ConcretePr

设计模式学习03—抽象工厂模式

1.动机与定义 工厂模式中,一个工厂仅仅能提供一个或一类产品,当产品种类较多,形成产品系列(比方我们要创建跨平台的button,菜单,文本框等等一系列GUI控件: 单纯使用工厂模式会产生大量工厂,并且后期维护也不方便,我们能够从产品中找到规律,假设产品等级相对固定,以后仅仅会新增产品族,那么我们就能够把整个产品族放到一个工厂创建,以后新增其它系统产品族也很方便,例如以下图: 这样的模式就是抽象工厂,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则须要面对多个产品等级结构,一个工厂等级结构能

(设计模式之一)浅析简单工厂模式

简单工厂模式 举个两个例子: 我输入两个数字和(+ - * /)其中一个符号,计算出两个数的结果. 饲养员让(狗 猫 鸟 猪)其中一个动物 叫 这里就是一个简单的工厂模式, 用户只需要提供他需要的接口,而不需要知道具体的实现 工厂判断用户提供的接口,创建对应的子类对象, 返回父类变量给用户(这里涉及里氏替换原则:声明父类变量替换子类对象) 当后面追加新的操作类例如:求根类  求平方类 , 从数据安全角度: 只需要创建新的类继承于Operation抽象类 ,从而不影响其他操作类(+ - * /),

常见的设计模式:单例模式、工厂模式、观察者模式、装饰模式与适配器模式

常见的设计模式:单例模式.工厂模式.观察者模式.装饰模式与适配器模式 这里可以阅读Terry Lee的设计模式系列来理解学习一下 1.4.1 单例模式 .NET设计模式(2):单件模式(Singleton Pattern)  http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 1.4.2 抽象工厂模式 .NET设计模式(3):抽象工厂模式(Abstract Factory) http://terrylee.cnblogs.com/

初探设计模式(1)——工厂模式

从今天起,打算系统学习一下设计模式,先从工厂模式开始,本系列的文章只是对设计模式初步学习的总结,如有写的不对的地方欢迎指正. 什么是工厂模式呢?所谓工厂在我们的日常生活中就是生产产品的地方,如汽车工厂,玩具工厂等,在程序的世界中,设计到"生产产品"字眼的是什么?没错,就是创建对象! "工厂"通俗来说就是一个创建对象(产品)的地方.工厂模式(Factory Pattern)是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式,是 Java 中最常用的设

设计模式C++实现——抽象工厂模式

模式定义: 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道实际产出的具体产品时什么.这样一来,客户就从具体的产品中被解耦了. 模式结构: 举例: 数据库访问程序设计,不同的数据库访问方式可能不一样,为了抽象对对不同数据库的访问,可以将数据库隐藏起来,提供统一的访问方式,用多态进行实现. UML设计: 编程实现及执行结果: #include <iostream> using namespace st

设计模式学习(二)-简单工厂模式

---恢复内容开始--- 简单工厂设计模式 简单工厂模式定义: 简单工厂设计模式又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 简单工厂主要分为如下几个角色 抽象产品(abstract product):为所有具体产品的抽象表现,一般为抽象类 具体产品(product):为抽象产品的具体实现 生成产品工厂(facto

设计模式(一)工厂模式Factory(创建型)

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

设计模式学习-抽象工厂模式

1.定义 提供接口,创建一系列相关或独立的对象,而不指定这些对象的具体类. 2.类图 3.代码示例 1 package com.zhaoyangwoo.abstractfactory; 2 3 /** 4 * Created by john on 16/5/2. 5 * @author wuzhaoyang 6 * <p> 7 * 抽象工厂:多个抽象产品类,派生出多个具体产品类:一个抽象工厂类,派生出多个具体工厂类:每个具体工厂类可创建多个具体产品类的实例. 8 * 即提供一个创建一系列相关或

《Head First 设计模式》学习笔记——工厂模式 + 抽象工厂模式

设计模式 工厂模式:定义一个创建对象的接口,但由子类决定要实例化的是哪一个.工厂方法让类把实例化推迟到子类. 所谓的"决定",并非指模式同意子类本身在执行时做决定,而是指在编写创建者类时.不须要知道实际创建的产品是哪一个. 选择了使用这个子类,就自然的决定了实际创建的产品是什么. 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族.而不须要指定详细类. 抽象工厂的任务时定义一个负责创建一组产品的接口.这个接口内的每一个产品都负责创建一个详细产品.使用工厂方法. 设计原则 (1)多