class ISplitter{
public:
virtual void split()=0;
virtual ~ISplitter(){}
};
class BinarySplitter : public ISplitter{
public:
virtual void split() {}
};
class TxtSplitter: public ISplitter{
public:
virtual void split() {}
};
class PictureSplitter: public ISplitter{
public:
virtual void split() {}
};
class VideoSplitter: public ISplitter{
public:
virtual void split() {}
};
class MainForm
{
public:
void Button1_Click(){
// 当我们需求进行改变的时候,需要修改这一部分代码
ISplitter * splitter=
new BinarySplitter();//依赖具体类
splitter->split();
}
};
//抽象类
class ISplitter{
public:
virtual void split()=0;
virtual ~ISplitter(){}
};
//具体类
class BinarySplitter : public ISplitter{
public:
virtual void split() {}
};
class TxtSplitter: public ISplitter{
public:
virtual void split() {}
};
class PictureSplitter: public ISplitter{
public:
virtual void split() {}
};
class VideoSplitter: public ISplitter{
public:
virtual void split() {}
};
/*---------------------------------------*/
//工厂基类
class SplitterFactory{
public:
virtual ISplitter* CreateSplitter()=0;
virtual ~SplitterFactory(){}
};
//具体工厂
class BinarySplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new BinarySplitter();
}
};
class TxtSplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new TxtSplitter();
}
};
class PictureSplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new PictureSplitter();
}
};
class VideoSplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new VideoSplitter();
}
};
/*------------------------------------------*/
class MainForm
{
SplitterFactory* factory;//工厂
public:
MainForm(SplitterFactory* factory){
this->factory = factory;
}
void Button1_Click(){
// 这里的时候我们创建新的模式的时候主要依赖于抽象
// 构造器建造一个新的模式对象时候由外部传参进来
ISplitter * splitter=
factory->CreateSplitter(); //多态new
splitter->split();
}
};
/*
我觉得这个代码的实现方法好像也可以,
但是这个每次只能创建一个Splitter实例
工厂模式会每次Button1_Click创建一哥新的Splitter
也就是相当于一个专门的工厂生产一类产品
所以还是的依据具体需求而设计不同的模式
class MainForm
{
ISplitter* splitter;//工厂
public:
MainForm(ISplitter* splitter){
this->splitter = splitter;
}
void Button1_Click(){
splitter->split();
}
};
*/
Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。Factory Method模式解决“单个对象"的需求变化。缺点在于要求创建方法/参数相同。