zoukankan      html  css  js  c++  java
  • 设计模式(二)——简单工厂模式

    工厂(Factory)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
    抽象产品(AbstractProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
    具体产品(Concrete Product)角色:简单工厂模式所创建的具体实例对象。

    优点:
    1. 实现了对象创建和使用的分离。
    2. 不需要记住具体类名,记住参数即可,减少使用者记忆量。
    缺点:
    1. 对工厂类职责过重,一旦不能工作,系统受到影响。
    2. 增加系统中类的个数,复杂度和理解度增加。
    3. 违反“开闭原则”,添加新产品需要修改工厂逻辑,工厂越来越复杂。

    适用场景
    1. 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成方法中的业务逻辑太过复杂。
    2. 客户端只知道传入工厂类的参数,对于如何创建对象并不关心

    #include <iostream>
    using namespace std;
    
    #if 0
    class Fruit
    {
    public:
        Fruit(string kind)
        {
            this->kind = kind;
            if (kind == "apple") {
                // 代表苹果
            }
            if (kind == "banana") {
                //代表香蕉
            }
        }
    
        void get_name()
        {
            if (this->kind == "apple") {
                cout << "我是苹果" << endl;
            }
            else if (this->kind == "apple") {
                cout << "我是香蕉" << endl;
            }
        }
    
    private:
        string kind;// 代表水果的种类
    };
    
    int main()
    {
        ////////////////////////////////////////////////////////////////////
        // main函数跟Fruit类的构造函数耦合度高,随着水果种类的增加,构造函数越来越复杂
        // 为了将main函数和构造函数隔离,设计工厂模式
        ////////////////////////////////////////////////////////////////////
        Fruit* apple = new Fruit("apple");
        apple->get_name();
        delete apple;
    
        system("pause");
        return 0;
    }
    #endif
    
    // 简单工厂模式实现
    class Fruit
    {
    public:
        virtual void get_name() = 0;
    };
    
    class Apple :public Fruit
    {
    public:
        virtual void get_name()
        {
            cout << "我是苹果" << endl;
        }
    };
    
    class Banana :public Fruit
    {
    public:
        virtual void get_name()
        {
            cout << "我是香蕉" << endl;
        }
    };
    
    // 增加一个品种 Pear
    class Pear :public Fruit
    {
    public:
        virtual void get_name()
        {
            cout << "我是鸭梨" << endl;
        }
    };
    
    
    // 工厂
    class Factory
    {
    public:
        Fruit * create_fruit(string kind)
        {
            if (kind == "apple") {
                return new Apple;
            }
            else if (kind == "banana") {
                return new Banana;
            }
            // 添加一个鸭梨,修改了工厂的方法,违背了开闭原则
            else if (kind == "pear") {
                return new Pear;
            }
        }
    };
    
    int main()
    {
        // 人们是跟工厂打交道
        Factory* factory = new Factory;// 创建一个工厂
        Fruit* apple = factory->create_fruit("apple");
        apple->get_name();
    
        delete factory;
        delete apple;
        system("pause");
        return 0;
    }
  • 相关阅读:
    zbb20170604 在linux (64bit)下安装rar for linux
    zbb20170601 oracle 存储过程 函数 包
    zbb20170601 oracle PL/SQL 语句块 游标 自定义游标 异常处理EXCEPTION
    5、Spring+Struts2+MyBatis+分页(mybatis无代理)增删改查
    2、枚举
    3、时间和随机数
    4、Spring+MyBatis增删改查
    3、Spring的AOP详解和案例
    2、Spring的 IoC详解(第一个Spring程序)
    1、Spring概述
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/10356720.html
Copyright © 2011-2022 走看看