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;
    }
  • 相关阅读:
    Android studio 安装已经下载好的gradle.zip文件【ubuntu 14.04 LTS环境】
    Python 2.7.6 安装lxml模块[ubuntu14.04 LTS]
    ubuntu14.04 LTS Python IDE专用编辑器PyCharm开发环境搭建
    Git 创建两个“本地分支”协同工作
    关于refs/for/ 和refs/heads/
    Git 多人协作开发的过程
    gerrit_bash_commands.sh
    Ubuntu Eclipse配置Python开发环境
    看看你那张熬完夜的脸
    2016-01-24
  • 原文地址:https://www.cnblogs.com/cauchy007/p/5380305.html
Copyright © 2011-2022 走看看