C++设计模式 工厂和单例模式到底该怎样结合?
工厂模式和单例模式到底该怎样结合效果才会更好? 比如一水果工厂,我们想要生产苹果,橘子,香蕉等等水果,我们定义了水果父类,然后在此基础上派生出苹果,橘子等子类。再定义一个工厂作为工厂类的父类。。到底该怎样结合单例模式呢,这里有两种可能的方法:
1):工厂类派生一个子水果类,此类只允许产生一个实例,通过这个实例,苹果,橘子等,都通过这一个实例生产。
2):工厂类分别派生出苹果工厂,橘子工厂等,而这些工厂都只能产生一个实例,用每一个相应的实例生产相应的水果。
PS:对于1),这里好像实现了单例,但它将工厂模式的那种分工协作淡化到了简单的工厂模式,这个单一的实例就如同一个全能的园丁可以生产各种水果,而和纯粹的简单工厂不同的是这个园丁是个暴君,他不允许异己存在。
2)这种方法,将全能的园丁能力分解了,分割给了各个子块,显得更加专业化,每个子块在系统中只能有一个实例,不过这满足单例的要求吗?
。。。。以上两种方法对吗??是不是会用更好的方法??工厂模式和单例模式怎样才能有个更好的结合,还是这两者根本就无法达到一个完美的统一????
[解决办法]
lz看过状态机没有;
我觉得那里适合单独模式。
[解决办法]
每种模式有特定的使用领域。比如singleton,你是否有这样的需求?
1)只能存在一个类的实例
2)需要方便地访问这个实例
如果有,就使用singleton模式。同样,你是否有对抽象工厂的需求:你需要在一个工厂基类的统一接口下操纵工厂子类,从而生成有一定关系的类对象集合。
你是否有对工厂方法的需求:你需要将一个类体系的生成细节封装在一个统一接口的工厂类中,然后通过多态来在这个类体系中产生不同实例,并同时保证接口的一致性。
模式是为需求准备的,你应该弄清需求,然后再考虑选择模式,而不是生拉硬套。
[解决办法]
其实这个问题和单例关系不是很大,单例的设计客户是不应该感觉到的,也就是说客户从工厂获得对象是根本不知道这个对象是不是单例。这样的工厂是最好设计。
第一种方法有个缺点就是若有一天需要增加西瓜,那么就得改水果工厂类。客户端至少需要重新编译。
相比较下,第二种方法只需增加一个新的水果工厂派生。客户端代码不要要修改和编译。
[解决办法]
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() {...}
...
};
static ConcreteFruitFactory *mInstance;
[解决办法]