zoukankan      html  css  js  c++  java
  • 设计模式创建型 C++版本

    一.Factory Method

    http://www.cnblogs.com/Clingingboy/archive/2010/08/26/1809554.html

    // 产品抽象类
    class CProduct
    {
    public:
        CProduct()
        {
            theApp.Trace(_T("CProduct 构造"));
        };
        virtual ~CProduct()
        {
            theApp.Trace(_T("CProduct 析构"));
        };
        
        virtual void Operation() = 0;
    };
    
    // 创建者抽象类
    class CCreator
    {
    public:
        CCreator()
        {
            theApp.Trace(_T("CCreator 构造"));
        };
        virtual ~CCreator()
        {
            theApp.Trace(_T("CCreator 析构"));
        };
    
        virtual CProduct* FactoryMethod() = 0;
        void Operation()
        {
            theApp.Trace(_T("CCreator::Operation()"));
            CProduct *pProduct = FactoryMethod();
            ASSERT(NULL != pProduct);
            pProduct->Operation();
            delete pProduct;
            pProduct = NULL;
        };
    };
    
    // 具体产品
    class CConcreteProduct : public CProduct
    {
    public:
        CConcreteProduct()
        {
            theApp.Trace(_T("CConcreteProduct 构造"));
        };
        virtual ~CConcreteProduct()
        {
            theApp.Trace(_T("CConcreteProduct 析构"));
        };
        
        virtual void Operation()
        {
            theApp.Trace(_T("CConcreteProduct::Operation()"));
        };
    };
    
    // 具体创建者
    class CConcreteCreator : public CCreator
    {
    public:
        CConcreteCreator()
        {
            theApp.Trace(_T("CConcreteCreator 构造"));
        };
        virtual ~CConcreteCreator()
        {
            theApp.Trace(_T("CConcreteCreator 析构"));
        };
        
        virtual CProduct* FactoryMethod()
        {
            return new CConcreteProduct;
        };
    };
    

    Test

    // 由子类创建对象
    CConcreteCreator oCreator;
    oCreator.Operation();
    

    二.AbstractFactory

    http://www.cnblogs.com/Clingingboy/archive/2010/08/26/1809556.html

    // 产品抽象类A
    class CAbstractProductA
    {
    public:
        CAbstractProductA()
        {
            theApp.Trace(_T("CAbstractProductA 构造"));
        };
        virtual ~CAbstractProductA()
        {
            theApp.Trace(_T("CAbstractProductA 析构"));
        };
    
        virtual void Operation() = 0;
    };
    
    // 产品抽象类B
    class CAbstractProductB
    {
    public:
        CAbstractProductB()
        {
            theApp.Trace(_T("CAbstractProductB 构造"));
        };
        virtual ~CAbstractProductB()
        {
            theApp.Trace(_T("CAbstractProductB 析构"));
        };
    
        virtual void Operation() = 0;
    };
    
    // 工厂抽象类
    class CAbstractFactory
    {
    public:
        CAbstractFactory()
        {
            theApp.Trace(_T("CAbstractFactory 构造"));
        };
        virtual ~CAbstractFactory()
        {
            theApp.Trace(_T("CAbstractFactory 析构"));
        };
    
        virtual CAbstractProductA* CreateProductA() = 0;
        virtual CAbstractProductB* CreateProductB() = 0;
    };
    
    // 具体产品A1
    class CProductA1 : public CAbstractProductA
    {
    public:
        CProductA1()
        {
            theApp.Trace(_T("CProductA1 构造"));
        };
        virtual ~CProductA1()
        {
            theApp.Trace(_T("CProductA1 析构"));
        };
        
        virtual void Operation()
        {
            theApp.Trace(_T("CProductA1::Operation()"));
        };
    };
    
    // 具体产品A2
    class CProductA2 : public CAbstractProductA
    {
    public:
        CProductA2()
        {
            theApp.Trace(_T("CProductA2 构造"));
        };
        virtual ~CProductA2()
        {
            theApp.Trace(_T("CProductA2 析构"));
        };
        
        virtual void Operation()
        {
            theApp.Trace(_T("CProductA2::Operation()"));
        };
    };
    
    // 具体产品B1
    class CProductB1 : public CAbstractProductB
    {
    public:
        CProductB1()
        {
            theApp.Trace(_T("CProductB1 构造"));
        };
        virtual ~CProductB1()
        {
            theApp.Trace(_T("CProductB1 析构"));
        };
        
        virtual void Operation()
        {
            theApp.Trace(_T("CProductB1::Operation()"));
        };
    };
    
    // 具体产品B2
    class CProductB2 : public CAbstractProductB
    {
    public:
        CProductB2()
        {
            theApp.Trace(_T("CProductB2 构造"));
        };
        virtual ~CProductB2()
        {
            theApp.Trace(_T("CProductB2 析构"));
        };
        
        virtual void Operation()
        {
            theApp.Trace(_T("CProductB2::Operation()"));
        };
    };
    
    // 具体工厂1
    class CConcreteFactory1 : public CAbstractFactory
    {
    public:
        CConcreteFactory1()
        {
            theApp.Trace(_T("CConcreteFactory1 构造"));
        };
        virtual ~CConcreteFactory1()
        {
            theApp.Trace(_T("CConcreteFactory1 析构"));
        };
    
        virtual CAbstractProductA* CreateProductA()
        {
            theApp.Trace(_T("CConcreteFactory1::CreateProductA()"));
            return new CProductA1;
        };
        virtual CAbstractProductB* CreateProductB()
        {
            theApp.Trace(_T("CConcreteFactory1::CreateProductB()"));
            return new CProductB1;
        };
    };
    
    // 具体工厂2
    class CConcreteFactory2 : public CAbstractFactory
    {
    public:
        CConcreteFactory2()
        {
            theApp.Trace(_T("CConcreteFactory2 构造"));
        };
        virtual ~CConcreteFactory2()
        {
            theApp.Trace(_T("CConcreteFactory2 析构"));
        };
        
        virtual CAbstractProductA* CreateProductA()
        {
            theApp.Trace(_T("CConcreteFactory2::CreateProductA()"));
            return new CProductA2;
        };
        virtual CAbstractProductB* CreateProductB()
        {
            theApp.Trace(_T("CConcreteFactory2::CreateProductB()"));
            return new CProductB2;
        };
    };
    

    Test

    // 创建一族对象
    CAbstractProductA *pProductA = NULL;
    CAbstractProductB *pProductB = NULL;
    
    CConcreteFactory1 oFactory1;
    pProductA = oFactory1.CreateProductA();
    pProductB = oFactory1.CreateProductB();
    ASSERT(NULL != pProductA && NULL != pProductB);
    pProductA->Operation();
    pProductB->Operation();
    delete pProductA;
    pProductA = NULL;
    delete pProductB;
    pProductB = NULL;
    
    CConcreteFactory2 oFactory2;
    pProductA = oFactory2.CreateProductA();
    pProductB = oFactory2.CreateProductB();
    ASSERT(NULL != pProductA && NULL != pProductB);
    pProductA->Operation();
    pProductB->Operation();
    delete pProductA;
    pProductA = NULL;
    delete pProductB;
    pProductB = NULL;
    

    三.Builder

    http://www.cnblogs.com/Clingingboy/archive/2010/08/26/1809558.html

    // 生成器抽象类
    class CBuilder
    {
    public:
        CBuilder()
        {
            theApp.Trace(_T("CBuilder 构造"));
        };
        virtual ~CBuilder()
        {
            theApp.Trace(_T("CBuilder 析构"));
        };
    
        virtual void BuildPart1() = 0;
        virtual void BuildPart2() = 0;
    };
    
    // 具体生成器类
    class CConcreteBuilder : public CBuilder
    {
    public:
        CConcreteBuilder()
        {
            theApp.Trace(_T("CConcreteBuilder 构造"));
        };
        virtual ~CConcreteBuilder()
        {
            theApp.Trace(_T("CConcreteBuilder 析构"));
        };
        
        virtual void BuildPart1()
        {
            theApp.Trace(_T("CBuilder::BuildPart1()"));
        };
        virtual void BuildPart2()
        {
            theApp.Trace(_T("CBuilder::BuildPart2()"));
        };
    };
    
    // 控制器类
    class CDirector
    {
    public:
        CDirector()
        {
            theApp.Trace(_T("CDirector 构造"));
        };
        virtual ~CDirector()
        {
            theApp.Trace(_T("CDirector 析构"));
        };
        
        void Construct(CBuilder &oBuilder)
        {
            theApp.Trace(_T("CDirector::Construct()"));
            oBuilder.BuildPart1();
            oBuilder.BuildPart2();
        };
    };
    

    Test

    // 可以用于复杂对象的创建,所谓复杂是指步骤多、条件多等
    CConcreteBuilder oBuilder;
    CDirector oDirector;
    oDirector.Construct(oBuilder);
    

    四.Prototype

    http://www.cnblogs.com/Clingingboy/archive/2010/08/26/1809549.html

    // 原型抽象类
    class CPrototype
    {
    public:
        CPrototype()
        {
            theApp.Trace(_T("CPrototype 构造"));
        };
        virtual ~CPrototype()
        {
            theApp.Trace(_T("CPrototype 析构"));
        };
    
        virtual CPrototype* Clone() = 0;
    };
    
    // 具体原型类1
    class CConcretePrototype1 : public CPrototype
    {
    public:
        CConcretePrototype1()
        {
            theApp.Trace(_T("CConcretePrototype1 构造"));
        };
        virtual ~CConcretePrototype1()
        {
            theApp.Trace(_T("CConcretePrototype1 析构"));
        };
        
        virtual CPrototype* Clone()
        {
            theApp.Trace(_T("CConcretePrototype1::Clone()"));
            CConcretePrototype1 *pClone = new CConcretePrototype1;
            *pClone = *this;
            return pClone;
        };
    };
    
    // 具体原型类2
    class CConcretePrototype2 : public CPrototype
    {
    public:
        CConcretePrototype2()
        {
            theApp.Trace(_T("CConcretePrototype2 构造"));
        };
        virtual ~CConcretePrototype2()
        {
            theApp.Trace(_T("CConcretePrototype2 析构"));
        };
        
        virtual CPrototype* Clone()
        {
            theApp.Trace(_T("CConcretePrototype2::Clone()"));
            CConcretePrototype2 *pClone = new CConcretePrototype2;
            *pClone = *this;
            return pClone;
        };
    };
    

    Test

    // 通过拷贝创建新对象
    CPrototype *pPrototype = new CConcretePrototype1;
    CPrototype *pPrototypeClone = pPrototype->Clone();
    delete pPrototype;
    pPrototype = NULL;
    delete pPrototypeClone;
    pPrototypeClone = NULL;
    CConcretePrototype2 oPrototype;
    pPrototypeClone = oPrototype.Clone();
    delete pPrototypeClone;
    pPrototypeClone = NULL;
    

    五.Singleton

    http://www.cnblogs.com/Clingingboy/archive/2010/08/26/1809560.html

    // 单件类
    class CSingleton  
    {
    private:
        CSingleton()                                // 私有构造,防止外部创建实例
        {
            theApp.Trace(_T("CSingleton 构造"));
        };
    
    public:
        virtual ~CSingleton() {};
    
        static CSingleton& GetInstance()            // 全局访问点
        {
            theApp.Trace(_T("CSingleton::GetInstance()"));
            static CSingleton s_oSingleton;            // 静态对象,保证只有一个实例
            return s_oSingleton;
        };
    
        void Operation()
        {
            theApp.Trace(_T("CSingleton::Operation()"));
        };
    };
    
    // 方便外部调用
    #define theSingleton (CSingleton::GetInstance())
    

    Test

    // 可以取代全局变量,用到的时候才创建对象
    theSingleton.Operation();
    theSingleton.Operation();
    
  • 相关阅读:
    nodejs内存溢出解决方法
    mongodb副本集与分片结合
    node加密
    守护进程,互斥锁,IPC,队列,生产者与消费者模型
    并发编程
    粘包问题
    socket编程
    xml模块
    网络编程
    异常处理
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/2047067.html
Copyright © 2011-2022 走看看