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

1. 简单工厂

1.1 简单工厂的定义

(1)提供一个创建对象实例的功能,而无须关心其具体实现

  ①Api接口:定义客户所需要的功能接口

  ②Impl:具体实现Api的实现类,可能会有多个

  ③SimpleFatory类:工厂,选择合适的实现类来创建Api接口对象

  ④Client:客户端,通过Factory来获取Api接口对象,然后面向Api接口编程。

(2)思考简单工厂

  ①简单工厂的本质选择实现,其重点在选择。工厂类内部的主要功能是“选择合适的实现类”来创建实例对象。

  ②简单工厂的目的:为客户端选择相应的实现,从而使得客户端和实现之间解耦。这样,具体实现发生了变化,也就不必变动客户端了,这个变化被简单工厂吸收和屏蔽掉了。

(3)简单工厂命名的建议

  ①类名建议为模块名称+Factory”。比如,用户模块的工厂就为UserFactory

  ②方法名通常为“get+接口名称”或者是“create+接口名称”。比如有一个接口名称为UserEbi,那么方法名称通常为getUserEbi或createUserEbi。

  ③不提倡将方法名称命名为“new+接口名称”,应该new在C++中是关键字,而且通过简单工厂获取的对象实例,并不一定每次都是要new一个新的实例。如果使用newUserEbi,会让人错觉,好象每次都是new一个新的实例一样。

1.2 简单工厂的优缺点

(1)简单工厂的优点

  ①帮助封装:简单工厂虽然简单,但是非常友好地帮助我们实现了组件的封装,让组件外部能真正的面向接口编程

  ②解耦,通过简单工厂,实现了客户端和具体实现类的解耦,客户端根本不知道具体是由谁来实现的,也不知道具体如何实现,只是通过工厂获取它需要的接口对象。

(2)简单工厂的缺点

  ①可能增加客户端的复杂度,客户端通过参数来选择具体的实现类,那么就必须让客户端了解各个参数所代表的具体功能和含义,会增加使用难度,也部分暴露了其内部实现。

  ②不方便扩展子工厂,将工厂类的构造函数设有私有,使用静态方法也创建接口。所以也就不能通过写简单工厂类的子类来改变创建接口方法的行为了。不过,通常情况下是不需要为简单工厂创建子类的。

  ③当新增加接口的实现类时,须去修改工厂类的代码,这不符合开闭原则

1.3 何时选用简单工厂

  ①如果要完全封装隔离具体实现,让外部只能通过接口来操作封装体。可以选用简单工厂,让客户端通过工厂来获取相应的接口,而无须关心具体的实现

  ②如果想把创建对象的职责集中管理控制,可以选用简单工厂

【实例分析】利用简单工厂实现的计算器

//创建型模式:简单工厂

#include <stdio.h>

//运算类(其它的加减乘法类从这里继承)
class COperator
{
protected:
    double mFirst;
    double mSecond;
public:
    void setFirst(double value){mFirst = value;}
    double getFirst(){return mFirst;}

    void setSecond(double value){mSecond = value;}
    double getSecond(){return mSecond;}

    virtual double getResult(){return 0;}
};

//加法类
class CAdd : public COperator
{
public:
    double getResult()
    {
        return mFirst + mSecond;
    }
};

//减法类
class CSub : public COperator
{
public:
    double getResult()
    {
        return mFirst - mSecond;
    }
};

//乘法类
class CMul : public COperator
{
public:
    double getResult()
    {
        return mFirst * mSecond;
    }
};

//除法类
class CDiv : public COperator
{
public:
    double getResult()
    {
         const double P = 0.000000000000001;
         if((-P < mSecond) && (mSecond< P)) //除数不能为0
         {
            return 0;
         }

        return mFirst / mSecond;
    }
};

//简单工厂类
class CSimpleFactory
{
public:
    /**
      *创建具体运算实现类对象的方法
      *@参数:从外部传入的选择条件(+、-、*、/)
      *@返回值:创建好的运算实现类对象
    */
    //将创建函数定义为静态成员函数,可以让客户端省去创建工厂类对象
    static COperator* createOperator(char cOperator)
    {
        COperator* oper = NULL;

        switch(cOperator)  //根据客户端传入的参数,选择创建具体的类
        {
        case ‘+‘:
            oper = new CAdd();
            break;
        case ‘-‘:
            oper = new CSub();
            break;
        case ‘*‘:
            oper = new CMul();
            break;
        case ‘/‘:
            oper = new CDiv();
            break;
        }

        return oper;
    }
};

int main()
{
    //客户端调用例子

    //客户端只需依赖COperator的接口类和工厂类,而无法知道具体的实现类
    //实现了客户端和具体实现类之间的解耦
    COperator* oper =  CSimpleFactory::createOperator(‘/‘);
    oper->setFirst(1);
    oper->setSecond(2);

    printf("%f + %f = %f\n", oper->getFirst(),oper->getSecond(),oper->getResult());

    return 0;
}
时间: 2024-10-05 04:58:48

第4章 创建型模式—工厂方法模式(1)的相关文章

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