简单工厂方法不符合开闭原则,增加按钮功能需要修改工厂类。
现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮、矩形按钮、菱形按钮等,它们实现在抽象按钮工厂类中定义的方法。这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需要为这种新类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例,这一特点无疑使得工厂方法模式具有超越简单工厂模式的优越性,更加符合“开闭原则”。
#include <iostream>
#include <string>
using namespace std;
// abstract button
class AbstractButton
{
public:
virtual void show_name() = 0;
};
class CircleButton : public AbstractButton
{
public:
void show_name()
{
cout << "我是圆形按钮" << endl;
}
};
class RectangleButton : public AbstractButton
{
public:
void show_name()
{
cout << "我是矩形按钮" << endl;
}
};
class DiamondButton : public AbstractButton
{
public:
void show_name()
{
cout << "我是菱形按钮" << endl;
}
};
// abstract button factory
class AbstractButtonFactory
{
public:
virtual AbstractButton* create_button() = 0;
};
class CircleButtonFactory : public AbstractButtonFactory
{
public:
AbstractButton* create_button()
{
return new CircleButton;
}
};
class RectangleButtonFactory : public AbstractButtonFactory
{
public:
AbstractButton* create_button()
{
return new RectangleButton;
}
};
class DiamondButtonFactory : public AbstractButtonFactory
{
public:
AbstractButton* create_button()
{
return new DiamondButton;
}
};
// test
void test_01()
{
AbstractButtonFactory* factory = NULL;
AbstractButton* button = NULL;
// circle button
factory = new CircleButtonFactory;
button = factory->create_button();
button->show_name();
delete factory;
delete button;
// rectangle button
factory = new RectangleButtonFactory;
button = factory->create_button();
button->show_name();
delete factory;
delete button;
// diamond button
factory = new DiamondButtonFactory;
button = factory->create_button();
button->show_name();
delete factory;
delete button;
}
int main(int argc, char* argv[])
{
test_01();
system("pause");
return 0;
}