MyException - 我的异常网
当前位置:我的异常网» C++ » C++设计形式 工厂和单例模式到底该怎样结合

C++设计形式 工厂和单例模式到底该怎样结合

www.MyException.Cn  网友分享于:2013-02-20  浏览:27次
C++设计模式 工厂和单例模式到底该怎样结合?
工厂模式和单例模式到底该怎样结合效果才会更好? 比如一水果工厂,我们想要生产苹果,橘子,香蕉等等水果,我们定义了水果父类,然后在此基础上派生出苹果,橘子等子类。再定义一个工厂作为工厂类的父类。。到底该怎样结合单例模式呢,这里有两种可能的方法:
1):工厂类派生一个子水果类,此类只允许产生一个实例,通过这个实例,苹果,橘子等,都通过这一个实例生产。
2):工厂类分别派生出苹果工厂,橘子工厂等,而这些工厂都只能产生一个实例,用每一个相应的实例生产相应的水果。

PS:对于1),这里好像实现了单例,但它将工厂模式的那种分工协作淡化到了简单的工厂模式,这个单一的实例就如同一个全能的园丁可以生产各种水果,而和纯粹的简单工厂不同的是这个园丁是个暴君,他不允许异己存在。
2)这种方法,将全能的园丁能力分解了,分割给了各个子块,显得更加专业化,每个子块在系统中只能有一个实例,不过这满足单例的要求吗?

。。。。以上两种方法对吗??是不是会用更好的方法??工厂模式和单例模式怎样才能有个更好的结合,还是这两者根本就无法达到一个完美的统一????

------解决方案--------------------
lz看过状态机没有;
我觉得那里适合单独模式。
------解决方案--------------------
每种模式有特定的使用领域。比如singleton,你是否有这样的需求?

1)只能存在一个类的实例
2)需要方便地访问这个实例

如果有,就使用singleton模式。同样,你是否有对抽象工厂的需求:你需要在一个工厂基类的统一接口下操纵工厂子类,从而生成有一定关系的类对象集合。

你是否有对工厂方法的需求:你需要将一个类体系的生成细节封装在一个统一接口的工厂类中,然后通过多态来在这个类体系中产生不同实例,并同时保证接口的一致性。

模式是为需求准备的,你应该弄清需求,然后再考虑选择模式,而不是生拉硬套。
------解决方案--------------------
其实这个问题和单例关系不是很大,单例的设计客户是不应该感觉到的,也就是说客户从工厂获得对象是根本不知道这个对象是不是单例。这样的工厂是最好设计。

第一种方法有个缺点就是若有一天需要增加西瓜,那么就得改水果工厂类。客户端至少需要重新编译。

相比较下,第二种方法只需增加一个新的水果工厂派生。客户端代码不要要修改和编译。

------解决方案--------------------
引用:
FruitFactory类的构造函数为保护,的确只能创建一个实例啊!
创造实例只能通过::
Factory* FruitFactory::getFactory()
 {
     if(factory==0)
       factory=new FruitFactory();
     return factory; 
 }
 
为什么不是单例?
  ……


你这个很明显不是单例。多线程情况下,就会出现多个factory。是的,你factory是静态的,但是第一个线程判断if(factory==0)为true的时候,第二个线程也进来判断,这时也是true,然后两个线程都进if里面new了。

static factory * p = new factory;

这才是正确的写法。
------解决方案--------------------

class FruitFactory // 抽象工厂模式
{
public:
    virtual ~FruitFactory() {}
    virtual Apple *produceApple() = 0;
    virtual Orange *produceOrange() = 0;
    virtual Banana *produceBanana() = 0;
};

class ConcreteFruitFactory : public FruitFactory
{
private:
    ConcreteFruitFactory *mInstance;
    ConcreteFruitFactory() {}
public:
    static FruitFactory *Instance() // Singleton模式
    {
        if (NULL == mInstance)
            mInstance = new ConcreteFruitFactory();
        return mInstance;
    }
protected:
    virtual Apple *produceApple() {...}
    ...
};

------解决方案--------------------
Faint! 漏了个static

static ConcreteFruitFactory *mInstance;

------解决方案--------------------
你要么对实例工厂分类:苹果工厂、橘子工厂。。。。;要么设定很多的produce。你说会添加很多东西,我不明白你要添加什么东西。如果你觉得produce函数太多,可以建立一张水果种类表,为每个水果添加一个标签,以标签和水果生产的函数指针形成键值对构造哈希表,这样就可以用一个标签和一个函数来操作了。

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有