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

  • 相关阅读:
    003_饿了么chaosmonkey实现
    mysql-5.7 innodb_buffer_pool刷新机制详解
    mysql-5.7中的innodb_buffer_pool_prefetching(read-ahead)详解
    mysql-5.7中innodb_buffer_pool页面淘汰算法
    scrapy 的一个例子
    scrapy 的框架的安装
    python 例程的一个好例子
    django中跨app引用model
    用ansible 完成一次性的工作(ad-Hoc)工作
    django 在建模时的一个手贱
  • 原文地址:https://www.cnblogs.com/wangzhao765/p/9172309.html
Copyright © 2011-2022 走看看