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

    工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

    总的来说,就是工厂方法模式封装了对象的创建,通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。

    抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确制定具体类。

    抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么。

    Pizza.h

    enum pizzaType {cheese, pepperoni, clam, veggie};
    
    class Pizza {
    public:
        String getName();
    
    protected:
        String name="";
    };
    
    class NYStyleCheesePizza: public Pizza {
    public:
        NYStyleCheesePizza();
    };
    
    class ChicagoStyleCheesePizza: public Pizza {
    public:
        ChicagoStyleCheesePizza();
    };
    
    class PizzaStore {
    public:
        Pizza orderPizza(pizzaType t);
    
    private:
        virtual Pizza createPizza(pizzaType t) = 0;
    };
    
    class NYStylePizzaStore: public PizzaStore {
    private:
        Pizza createPizza(pizzaType t);
    };
    
    class ChicagoPizzaStore: public PizzaStore {
    private:
        Pizza createPizza(pizzaType t);
    };

    Pizza.cpp

    #include "Pizza.h"
    
    String Pizza::getName() {
        return name;
    }
    
    NYStyleCheestPizza::NYStyleCheesePizza() {
        name = "NY Style Sauce and Cheese Pizza";
    }
    
    ChicagoStyleCheesePizza::ChicagoStyleCheesePizza() {
        name = "Chicago Style Deep Dish Cheese Pizza";
    }
    
    Pizza PizzaStore::orderPizza(pizzaType t) {
        Pizza pizza = createPizza(t);
        return pizza;
    }
    
    Pizza NYStylePizzaStore::createPizza(pizzaType t) {
        if (t == cheese) {
            return NYStyleCheesePizza;
        }
    }
    
    Pizza ChicagoPizzaStore::createPizza(pizzaType t) {
        if (t == cheese) {
            return ChicagoStyleCheesePizza;
        }
    }

    注意的点:

    好像并没有什么需要注意的点。主要就是把类的实体化部分封装起来,通过一些标识,比如枚举类型或者字符串,来区别到底实体化哪种子类。

    blog的工厂模式的例子真的是工厂,不过好像也没什么特别的。https://blog.csdn.net/wuzhekai1985/article/details/6660462

  • 相关阅读:
    Microsoft.mshtml到底是什么?
    编译.NET程序自动产生版本号的规则
    VB.NET(2005)中关于dll调用的错误信息(转)
    C# RichTextBox控件 滚动条 自动移至 最后一条记录处
    如何刪除richtextbox最後一行
    Using Hudson for C++/CMake/CppUnit
    让开发自动化: 选择持续集成服务器
    C#加载窗体错误
    各种CI工具对比表
    用 Hudson 实现 Visual Studio (C++) 项目的 daily build
  • 原文地址:https://www.cnblogs.com/wangzhao765/p/9172309.html
Copyright © 2011-2022 走看看