设计模式学习之工厂模式[转]

  工厂模式笔记

    摘自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 };    

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

工厂方法模式也有缺点,每增加一种产品,就需要增加一个对象的工厂。如果这家公司发展迅速,推出了很多新的处理器核,那么就要开设相应的新工厂。在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 };   

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

简单工厂模式的UML图:

工厂方法的UML图:

抽象工厂模式的UML图:

  个人ps:

    简单工厂模式:一个工厂类,工厂生产什么需要告诉工厂类;

    工厂方法模式:每一个工厂生产一种商品,需要什么商品,只需要找相应的工厂即可;

    抽象工厂模式:一个抽象工厂类,一个抽象商品类,其中分别定义生产和具体商品的接口,具体由哪个工厂生产哪种商品都是由子类决定。

时间: 2024-10-07 22:01:17

设计模式学习之工厂模式[转]的相关文章

设计模式学习02—工厂模式

1.动机与定义 我们在程序中使用一个对象时,需要new一下,如果需要设置其他值就再初始化一下.比如我要使用一个按钮,手动new一个矩形按钮,然后初始化一些值,如显示文字,背景色等. // 矩形按钮 IButton btn = new RecButton(); // 初始化其他值 btn.setText("提交"); btn.setBackgroundColor("#00aaff"); // 其他初始化省略 // 圆形按钮 IButton btn2 = new Rou

设计模式学习之--工厂模式

今天学习的设计模式是工厂模式.那么为什么叫它工厂模式呢?工厂模式,顾名思义就是用一个工厂生产各种东西,工厂模式是如何体现的呢? 首先,工厂模式有简单的工厂模式和抽象工厂模式两种,我们先用一个发型的工厂来演示一下简单的工厂模式: 一个发型接口:工厂模式是面向接口编程的,这样可以更易于程序的扩展 package com.sunny.project; /** * 发型接口 * @author Administrator * */ public interface HairInterface { /**

设计模式学习笔记-工厂模式

一.概述 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法(Factory Method)使一个类的实例化延迟到其子类: 2.模式中的角色 Product(Map):定义工厂方法所创建的对象的接口. ConcreteProduct(BaiduMap.GaodeMap):具体Product,实现Product接口. Creator(IMapFactory):声明工厂方法,该方法返回一个Product类型的对象. ConcreteCreator(BaiduMapFactory.Gaod

&lt;C/C++ 版&gt; 设计模式 学习之 工厂模式 &lt;1&gt;

大话设计模式这本书使用 C# 语言写的,我用的是 C++ 语言,最近在看这本书,所以用 C++ 语言走了一遍. 以下是部分笔记,包括代码 若不涉及面向对象这个概念,我们写的简易计算器可能是下面这个样子 //User.cpp --- 客户端 #include "iostream" int main() { using namespace std; cout<<"Input First Number : "; int number_a; cin>>

设计模式学习——简单工厂模式

模式概述:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,但其不属于23种GOF设计模式之一,通常它根据自变量的不同返回不同的类的实例.     UML类图: 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建出哪一个产品类的实例.由上图可以看出,简单工厂模式有工厂.抽象产品.具体产品三个角色. 工厂角色(Factory) 是

Java设计模式学习三-----工厂模式

工厂模式 工厂模式(Factory Pattern)是Java中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象. 工厂模式的思路:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行.使用过程中做好接口选择. 优点:1.一个调用者向创建一个对象,只要知道名称就可以了.2.扩展性高,如果想增加一个产品,只要扩展一个工厂

设计模式学习-简单工厂模式

1.什么是简单工厂模式 简单工厂模式属于类的创建模式,又叫做静态工厂模式,是通过专门建立一个类负责创建其他类的实例,被创建的类通常有着共同的父类,之所以称之为工厂,就是因为负责创建其他类的类能够根据传递参数的不同,产生不同的实例,使得程序满足松耦合.重用度高.易修改维护的特点. 2.简单工厂模式的实现 下面举例说明工厂模式,比如说我们要实现一个两个数的size运算,那么如何去设计能过做到我们上面说的特性.首先我们要设定一个运算的终极父类: #include <iostream> #includ

(@WhiteTaken)设计模式学习——抽象工厂模式

抽象工厂模式,可以向客户端提供一个接口,而客户端不用指定具体的类型创建对象,却能够创建多个产品族(一类具有共性产品,如地域等)的对象. 下面直接上代码. 1.苹果需要实现水果的接口,而苹果可以有北方的苹果,也可以有南方的苹果,所以也可以抽象成一个父类. 1 public interface Fruit { 2 public void Get(); 3 } 4 5 public abstract class Apple implements Fruit{ 6 public abstract voi

php设计模式学习之工厂模式

我的认为:所为工厂模式是事先有一系类class,一个工厂类' 工厂类根据不同的参数创建不同的对象,调用各自的方法; php利用工厂模式实现计算器: ?php /** * Created by PhpStorm. * User: modern * Date: 16-7-19 * Time: 下午5:24 * 简单工厂模式两数运算器 */ echo "hello factory models<br/>"; echo "begin<br/>"; i