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;
    }
  • 相关阅读:
    Activiti7 历史任务实例查询
    在springboot中开启Activiti的SQL日志
    SpringMvc接收日期参数
    Intellij IDEA 的Run Configuration配置VM options参数
    <el-input>点击事件
    Vue自定义组件中Props类型为数组或对象
    bpmn-js画流程图 (四)右侧属性面板中执行人,候选人与候选组可以通过 用户、机构(角色)选择
    外部js调用vue的方法
    vue-cli4 取消关闭eslint 校验代码
    bpmn-js画流程图 (三)隐藏右下角的绿色logo
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/10356720.html
Copyright © 2011-2022 走看看