简单工厂模式简单的来说,就是由一个对象决定创建出哪一种类。
接下来我们以单纯的电脑上选择输入法的例子来进行简单工厂模式的分析。
例如:
我们现在电脑上基本上都装了好几种输入法,用户往往只需要简单的鼠标操作几下或者快捷键切换,来迅速得到你想要的输入法,假设你的电脑上装有QQ输入法、搜狗输入法、微软拼音输入法,用户可以设置使用哪种类型的输入法,那我们可以通过分析可知,我们只需要定义一个接口类(InputMethod)来得到用户的操作指令,然后通过定义一个简单的工厂类(SimpleFactory)来调用具体的输入法操作类。(由于作者才疏学浅,所以我只对类进行了简单的定义,抱歉!)
类图:
接下来我们实现这个类图:
1.首先我们定义一个操作接口类:
class InputMethod
{
private:
char order;
InputMethod():order('0'){}//构造函数
public:
char GetOrder() const {return order;}
void SetOrder(char num) {order=num;}
void virtual AlterInput(){}//析构函数
};
2.接下来定义具体的操作类:
class QQInputMethod : public InputMethod
{
public:
void AlterInput()
{
cout<<"成功切换成QQ输入法"<<endl;//我们以此代表切换输入法的语句
}
};
class MicrosoftInputMethod : public InputMethod
{
public:
void AlterInput()
{
cout<<"成功切换成微软输入法"<<endl;//我们以此代表切换输入法的语句
}
};
class SogouInputMethod : public InputMethod
{
public:
void AlterInput()
{
cout<<"成功切换成搜狗输入法"<<endl;//我们以此代表切换输入法的语句
}
};
3.定义一个简单工厂类:
class SimpleFactory
{
public:
static InputMethod * CreateOrder(char ch)
{
InputMethod * im;//实例化
switch(im)
{
case 'Q':
p = new QQInputMethod();
break;
case 'S':
p = new SogouInputMethod();
break;
case 'M':
p = new MicrosoftInputMethod();
break;
}
return im;
}im
};
在操作中我们不需要提供具体的子类类名,只需要提供一个类型即可得到相应的实例对象。这样的好处是,如果当子类的类名更换或者增加子类时我们都无需修改客户端代码;但是它的缺点同样在于如果我们需要添加新功能,都需要修改工厂,操作复杂,不符合开闭原则。简单的来说,简单工厂模式就是提供专门的工厂类用于创建对象,将对象的创建和对象的使用分离开,它作为一种最简单的工厂模式在软件开发中得到了较为广泛的应用。(如:QQ背景墙的更换,在游戏中人物武器的替换,在支付中选择支付方式等等)
以上内容纯粹属于个人理解,如果有错误,感谢大家的指正,谢谢!