zoukankan      html  css  js  c++  java
  • 创建型模式のFactory Method工厂方法模式

    工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系 统在不修改具体工厂角色的情况下引进新的产品。这个例子更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。贴代码了。

    5.1.解释

    main(),女娲

    IHuman,产品接口

    CYellowHuman,产品之一

    CWhiteHuman,产品之二

    CBlackHuman,产品之三

    IHumanFactory,工厂接口

    CYellowHumanFactory,工厂之一

    CWhiteHumanFactory,工厂之二

    CBlackHumanFactory,工厂之三


    看代码:

    //IHuman.h

    #pragma once
    class IHuman
    {
    public:
        IHuman(void)
        {
        }
        virtual ~IHuman(void)
        {
        }
        virtual void Laugh() = 0;
        virtual void Cry() = 0;
        virtual void Talk() = 0;
    };

    //YellowHuman.h

    #pragma once
    #include "ihuman.h"
    class CYellowHuman :
        public IHuman
    {
    public:
        CYellowHuman(void);
        ~CYellowHuman(void);
        void Laugh();
        void Cry();
        void Talk();
    };
    
    //YellowHuman.cpp
    
    #include "StdAfx.h"
    #include "YellowHuman.h"
    #include <iostream>
    using std::cout;
    using std::endl;
    CYellowHuman::CYellowHuman(void)
    {
    }
    CYellowHuman::~CYellowHuman(void)
    {
    }
    void CYellowHuman::Cry()
    {
        cout << "黄色人种会哭" << endl;
    }
    void CYellowHuman::Laugh()
    {
        cout << "黄色人种会大笑,幸福呀!" << endl;
    }
    void CYellowHuman::Talk()
    {
        cout << "黄色人种会说话,一般说的都是双字节" << endl;
    }

    //WhiteHuman.h

    #pragma once
    #include "ihuman.h"
    class CWhiteHuman :
        public IHuman
    {
    public:
        CWhiteHuman(void);
        ~CWhiteHuman(void);
        void Laugh();
        void Cry();
        void Talk();
    };
    
    //WhiteHuman.cpp
    
    #include "StdAfx.h"
    #include "WhiteHuman.h"
    #include <iostream>
    using std::cout;
    using std::endl;
    CWhiteHuman::CWhiteHuman(void)
    {
    }
    CWhiteHuman::~CWhiteHuman(void)
    {
    }
    void CWhiteHuman::Cry()
    {
        cout << "白色人种会哭" << endl;
    }
    void CWhiteHuman::Laugh()
    {
        cout << "白色人种会大笑,侵略的笑声" << endl;
    }
    void CWhiteHuman::Talk()
    {
        cout << "白色人种会说话,一般都是单字节" << endl;
    }

    //BlackHuman.h

    
    

    #pragma once
    #include "ihuman.h"
    class CBlackHuman :
        public IHuman
    {
    public:
        CBlackHuman(void);
        ~CBlackHuman(void);
        void Laugh();
        void Cry();
        void Talk();
    };

    
    

    //BlackHuman.cpp

    
    

    #include "StdAfx.h"
    #include "BlackHuman.h"
    #include <iostream>
    using std::cout;
    using std::endl;
    CBlackHuman::CBlackHuman(void)
    {
    }
    CBlackHuman::~CBlackHuman(void)
    {
    }
    void CBlackHuman::Cry()
    {
        cout << "黑人会哭" << endl;
    }
    void CBlackHuman::Laugh()
    {
        cout << "黑人会笑" << endl;
    }
    void CBlackHuman::Talk()
    {
        cout << "黑人可以说话,一般人听不懂" << endl;
    }


    //IHumanFactory.h

    #pragma once
    #include "IHuman.h"
    class IHumanFactory
    {
    public:
        IHumanFactory(void)
        {
        }
        virtual ~IHumanFactory(void)
        {
        }
        virtual IHuman * CreateHuman() = 0;
    };


    //YellowHuman.h

    #pragma once
    #include "ihumanfactory.h"
    class CYellowHumanFactory :
        public IHumanFactory
    {
    public:
        CYellowHumanFactory(void);
        ~CYellowHumanFactory(void);
        virtual IHuman * CreateHuman(void);
    };

    //YellowHumanFactory.cpp

    #include "StdAfx.h"
    #include "YellowHumanFactory.h"
    #include "YellowHuman.h"
    CYellowHumanFactory::CYellowHumanFactory(void)
    {
    }
    CYellowHumanFactory::~CYellowHumanFactory(void)
    {
    }
    IHuman * CYellowHumanFactory::CreateHuman( void )
    {
        return new CYellowHuman();
    }


    //WhiteHuman.h

    #pragma once
    #include "ihumanfactory.h"
    class CWhiteHumanFactory :
        public IHumanFactory
    {
    public:
        CWhiteHumanFactory(void);
        ~CWhiteHumanFactory(void);
        virtual IHuman * CreateHuman(void);
    };


    //WhiteHumanFactory.cpp

    #include "StdAfx.h"
    #include "WhiteHumanFactory.h"
    #include "WhiteHuman.h"
    CWhiteHumanFactory::CWhiteHumanFactory(void)
    {
    }
    CWhiteHumanFactory::~CWhiteHumanFactory(void)
    {
    }
    IHuman * CWhiteHumanFactory::CreateHuman( void )
    {
        return new CWhiteHuman();
    }


    //BlackHuman.h

    #pragma once
    #include "ihumanfactory.h"
    class CBlackHumanFactory :
        public IHumanFactory
    {
    public:
        CBlackHumanFactory(void);
        ~CBlackHumanFactory(void);
        virtual IHuman * CreateHuman();
    };


    //BlackHumanFactory.cpp

    #include "StdAfx.h"
    #include "BlackHumanFactory.h"
    #include "BlackHuman.h"
    CBlackHumanFactory::CBlackHumanFactory(void)
    {
    }
    CBlackHumanFactory::~CBlackHumanFactory(void)
    {
    }
    IHuman * CBlackHumanFactory::CreateHuman()
    {
        return new CBlackHuman();
    }

    //FactoryMethod.cpp

    // FactoryMethod.cpp : 定义控制台应用程序的入口点。
    //
    #include "stdafx.h"
    #include "IHuman.h"
    #include "YellowHuman.h"
    #include "WhiteHuman.h"
    #include "BlackHuman.h"
    #include "SimpleHumanFactory.h"
    #include "StandardHumanFactory.h"
    #include "IHumanFactory.h"
    #include "YellowHumanFactory.h"
    #include "WhiteHumanFactory.h"
    #include "BlackHumanFactory.h"
    #include <iostream>
    using std::cout;
    using std::endl;
    using std::string;
    void DoFactoryMethod1()
    {
        cout << "----------第一批人是这样的:黄种人工厂来生产黄种人" << endl;
        IHumanFactory *pHumanFactory = new CYellowHumanFactory();
        IHuman *pHuman = pHumanFactory->CreateHuman();
        pHuman->Cry();
        pHuman->Laugh();
        pHuman->Talk();
        delete pHuman;
        delete pHumanFactory;
    }
    void DoFactoryMethod2()
    {
        cout << "----------第二批人是这样的:白种人工厂来生产白种人" << endl;
        IHumanFactory *pHumanFactory = new CWhiteHumanFactory();
        IHuman *pHuman = pHumanFactory->CreateHuman();
        pHuman->Cry();
        pHuman->Laugh();
        pHuman->Talk();
        delete pHuman;
        delete pHumanFactory;
    }
    void DoFactoryMethod3()
    {
        cout << "----------第一批人是这样的:黑种人工厂来生产黑种人" << endl;
        IHumanFactory *pHumanFactory = new CBlackHumanFactory();
        IHuman *pHuman = pHumanFactory->CreateHuman();
        pHuman->Cry();
        pHuman->Laugh();
        pHuman->Talk();
        delete pHuman;
        delete pHumanFactory;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
        //工厂方法
        cout << "----------工厂方法:" << endl;
        DoFactoryMethod1();
        DoFactoryMethod2();
        DoFactoryMethod3();
       
        _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
        _CrtDumpMemoryLeaks();
        return 0;
    }

    工厂方法属于创建型模式,适合于产品不太多的情况。产品如果很多,则需要用抽象工厂来实现。

    本文转自:~~~

  • 相关阅读:
    Java的五个基础面试题 容易搞倒老手的
    新北邦java笔试题
    Mysql面试题及答案
    MySQL取得当前时间的函数是什么 格式化日期的函数是什么
    mysql索引优化面试题
    介绍一下mysql的日期和时间函数
    MYSQL面试题:简单叙述一下MYSQL的优化
    不少程序员都会碰到的三个面试题
    HTTP URLEncoding
    Comparable vs. Comparator in Java
  • 原文地址:https://www.cnblogs.com/labi/p/3580416.html
Copyright © 2011-2022 走看看