zoukankan      html  css  js  c++  java
  • 设计模式(6)---抽象工厂模式

      抽象工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

      简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但是随着新的类型增加时,必须对原有的简单工厂进行修改,破坏了开放-封闭原则。

      抽象工厂模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,抽象工厂把简单工厂的内部逻辑判断移到了客户端来进行。你想要加功能,本来是改工厂类的,而现在是修改客户端。

    // AbstractFactory.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <memory>
    #include <iostream>
    
    using namespace std;
    
    enum LEI_FENG_TYPE
    {
        UNDER_GRADUATE,
        VOLUNTEER
    };
    
    
    class LeiFeng
    {
    public:
        virtual void Sweep(void) = 0;
        virtual void Wash(void) = 0;
        virtual void BuyRice(void) = 0;
    
        virtual ~LeiFeng()
        {}
    };
    
    class UnderGraduate : public LeiFeng
    {
    public:
        virtual void Sweep(void)
        {
            cout << "UnderGraduate Sweep !" << endl;
        }
        virtual void Wash(void)
        {
            cout << "UnderGraduate Wash !" << endl;
        }
        virtual void BuyRice(void)
        {
            cout << "UnderGraduate Buy Rice !" << endl;
        }
    };
    
    class Volunteer :public LeiFeng
    {
    public:
        virtual void Sweep(void)
        {
            cout << "Volunteer Sweep !" << endl;
        }
        virtual void Wash(void)
        {
            cout << "Volunteer Wash !" << endl;
        }
        virtual void BuyRice(void)
        {
            cout << "Volunteer Buy Rice !" << endl;
        }
    };
    
    class SimpleFactory
    {
    public:
        static shared_ptr<LeiFeng> CreateLeiFeng(const LEI_FENG_TYPE &type)
        {
            switch (type)
            {
            case UNDER_GRADUATE:
                cout << "Create undergraduate:" << endl;
                return make_shared<UnderGraduate>();
            case VOLUNTEER:
                cout << "Create volunteer:" << endl;
                return make_shared<Volunteer>();
            default:
                cout << "Error Type" << endl;
                return nullptr;
            }
        }
    };
    
    class AbstractFactory
    {
    public:
        virtual shared_ptr<LeiFeng> CreateLeiFeng() = 0;
    };
    
    class UnderGraduateFactory : public AbstractFactory
    {
    public:
        shared_ptr<LeiFeng> CreateLeiFeng()
        {
            return make_shared<UnderGraduate>();
        }
    };
    
    class VolunteerFactory : public AbstractFactory
    {
    public:
        shared_ptr<LeiFeng> CreateLeiFeng()
        {
            return make_shared<Volunteer>();
        }
    };
    
    
    int main()
    {
        //1.simple factory类型判断放在工厂类中
        auto lei_feng_a = SimpleFactory::CreateLeiFeng(UNDER_GRADUATE);
        lei_feng_a->Sweep();
        lei_feng_a->Wash();
        lei_feng_a->BuyRice();
    
    
        //2.abstract factory类型判断是由不同的继承来实现
        auto abstract_factory = make_shared<UnderGraduateFactory>();
        auto lei_feng_b = abstract_factory->CreateLeiFeng();
        lei_feng_b->Sweep();
        lei_feng_b->Wash();
        lei_feng_b->BuyRice();
    
    
        return 0;
    }
  • 相关阅读:
    使用gulp搭建一个传统的多页面前端项目的开发环境
    抓包工具使用
    selectors 模块
    I/O模型
    协程
    进程池
    进程的同步
    进程间通讯的三种方式
    多进程调用
    生产者消费者模型
  • 原文地址:https://www.cnblogs.com/cauchy007/p/5380305.html
Copyright © 2011-2022 走看看