工厂模式和单例模式

#include <iostream>
#include <pthread.h>

using  namespace std;

class  AbstractProductA
{
public:
    virtual   ~AbstractProductA() {}
    virtual   void  Operation() = 0;
};

class  AbstractProductB
{
public:
    virtual  ~AbstractProductB() {}
    virtual  void  Operation() = 0;
};

class AbstractFactory
{
public:
    virtual   ~AbstractFactory() {}
    virtual   AbstractProductA*  CreateProductA() = 0;
    virtual   AbstractProductB*  CreateProductB() = 0;

};

class  ProductA1 : public AbstractProductA

{

public:

   virtual  void  Operation()
    {
        printf("ProductA1\n");
    }
};

class  ProductB1 : public  AbstractProductB
{
public:
    virtual  void  Operation()
    {
        printf("ProductB1\n");
    }
};

class  ProductA2 : public AbstractProductA
{
public:
    virtual  void  Operation()
    {
        printf("ProductA2\n");
    }
};

class  ProductB2 : public AbstractProductB
{
public:
    virtual  void  Operation()
    {
        printf("ProductB2\n");
    }
};
class  Factory1 : public  AbstractFactory
{
public:
    virtual   AbstractProductA*  CreateProductA()
    {
        return  new  ProductA1();
    }
    virtual   AbstractProductB*  CreateProductB()
    {
        return  new  ProductB1();
    }
};
class  Factory2 : public  AbstractFactory
{
public:
    virtual   AbstractProductA*  CreateProductA()
    {
        return  new  ProductA2();
    }
    virtual   AbstractProductB*  CreateProductB()
    {
        return  new  ProductB2();
    }
};

class  Locker
{
public:
    Locker()
    {
        pthread_mutex_init(&m_mutex, NULL);
    }
    ~Locker()
    {
        pthread_mutex_destroy(&m_mutex);
    }
    void  Lock()
    {
        pthread_mutex_lock(&m_mutex);
    }
    void  UnLock()
    {
        pthread_mutex_unlock(&m_mutex);
    }
private:
    pthread_mutex_t  m_mutex;
};

class  Syncer 
{
public:
    Syncer(Locker& locker)
        : m_locker(locker)
    {
        m_locker.Lock();
    }
    ~Syncer()
    {
        m_locker.UnLock();
    }
private:
    Locker&  m_locker;
};

// single instance hungry
class  Singleton
{
public:
    static  Singleton*  GetInstance();
private:
    static  Singleton*  m_pInstance;
private:
    Singleton() {}
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);
};

Singleton*  Singleton::m_pInstance = new  Singleton();

Singleton*  Singleton::GetInstance()
{
    return m_pInstance;
}

// lazy
Locker locker; // global

class  Singleton_1
{
public:
    static Singleton_1*  GetInstance();
private:
    static  Singleton_1*  m_pInstance;
private:
    Singleton_1() {}
    Singleton_1(const Singleton_1&);
    Singleton_1& operator=(const Singleton_1&);
};

Singleton_1*  Singleton_1::m_pInstance = NULL;

Singleton_1*  Singleton_1::GetInstance()
{
    if (NULL == m_pInstance) {    // double locker
        Syncer sync(locker);
        if (NULL == m_pInstance) {
            m_pInstance = new  Singleton_1();
        }
    }
    return m_pInstance;
}

class  Singleton_2
{
public:
    static  Singleton_2&  GetInstance()
    {
        Syncer sync(locker);  // local static instance.
        static  Singleton_2  instance;
        return instance;

    }

private:
    Singleton_2() {}
    Singleton_2(const Singleton_2&);
    Singleton_2& operator=(const Singleton_2&);
};

int main()
{
    Singleton* instance = Singleton::GetInstance();
    if (instance) {
        printf("instance = [%p]\n", instance);
    }
    /*
    AbstractFactory*  factory = new   Factory1();
    AbstractProductA* productA = factory->CreateProductA();
    productA->Operation();
    delete productA;
    AbstractProductB* productB = factory->CreateProductB();
    productB->Operation();
    delete productB;
    delete factory;
    factory = new  Factory2();
    productA = factory->CreateProductA();
    productA->Operation();
    delete productA;
    productB = factory->CreateProductB();
    productB->Operation();
    delete productB;
    delete factory;
    */
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值