zoukankan      html  css  js  c++  java
  • 简单工厂模式

        简单工厂模式

    一、简介

      简单工厂模式又叫静态工厂方法(Static Factory Method)模式。

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

      简单的说,就是一个专门的类来负责所有的实例的创建。

    二、角色及其职责

      工厂(Creator)角色

        简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

      抽象产品(Product)角色

        简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

      具体产品(Concrete Product)角色

        是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

    三、优缺点

      优点

        1. 分离产品的创建者和消费者,有利于软件系统结构的优化。

        2. 能根据外界给定的信息,决定应该创建哪个具体类的对象。

      缺点:

        1. 违反了开放封闭原则,如果需要添加新的类,需要改变工厂类。

        2. 一旦工厂不能正常工作,整个系统都要受到影响

        3. 由于工厂类是静态的,无法让子类继承,无法形成基于基类的继承树结构。

    四、使用场景

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

    五、源码

      摘自《大话设计模式》

     1 class COperation
     2 {
     3 public:
     4     int m_nFirst;
     5     int m_nSecond;
     6     virtual double GetResult() = 0;11 };
    12 //加法
    13 class AddOperation : public COperation
    14 {
    15 public:
    16     virtual double GetResult()
    17     {
    18         return m_nFirst + m_nSecond;
    19     }
    20 };
    21 //减法
    22 class SubOperation : public COperation
    23 {
    24 public:
    25     virtual double GetResult()
    26     {
    27         return m_nFirst - m_nSecond;
    28     }
    29 };
    30 
    31 //工厂类
    32 class CCalculatorFactory
    33 {
    34 public:
    35     static COperation* Create(char cOperator);
    36 };
    37 
    38 COperation* CCalculatorFactory::Create(char cOperator)
    39 {
    40     COperation *oper;
    41     //在C#中可以用反射来取消判断时用的switch,在C++中用什么呢?RTTI??
    42     switch (cOperator)
    43     {
    44     case '+':
    45         oper=new AddOperation();
    46         break;
    47     case '-':
    48         oper=new SubOperation();
    49         break;
    50     default:
    51         oper=new AddOperation();
    52         break;
    53     }
    54     return oper;
    55 }
    56 
    57 客户端
    58 int main()
    59 {
    60     int a,b;
    61     cin>>a>>b;
    62     COperation * op = CCalculatorFactory::Create('-');
    63     op->m_nFirst=a;
    64     op->m_nSecond=b;
    65     cout<<op->GetResult()<<endl;
    66     return 0;
    67 }
  • 相关阅读:
    【转】 Pro Android学习笔记(九一):了解Handler(5):组件生命
    【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler
    C# 文字转成声音
    ShowDialog窗体的return问题
    8位、24位、32位图像数据转换
    winform 控件随页面大小进行自适应
    winform下实现pictureBox全屏播放
    SQLServer中求两个字符串的交集(字符串以符号分隔)
    一段四表联查外加字符拼接的sql,留存备查
    使用Nancy搭建简单的Http服务的示例demo
  • 原文地址:https://www.cnblogs.com/SnailProgramer/p/4198884.html
Copyright © 2011-2022 走看看