前言
假设你开了一家奶茶店,顾客可以点普通奶茶,珍珠奶茶,香芋奶茶和红枣奶茶
一.传统模式
传统模式下,顾客根据名字点单,你获取名字然后做出奶茶。
class MilkTea{string name;
public:MilkTea* create(string TeaName){MilkTea * newTea=new MilkTea();newTea.name=TeaName;return newTea;}
}
在这种情况下,我们想要做其他口味的奶茶,就需要对原有代码进行修改;在简单情况下还好,但是类的关系稍加复杂,我们就得修改所有相关代码。比如我们想做柠檬水,还想做西瓜椰,这将导致我们需要在原来的类中添加相关属性,并且不是所有奶茶都需要的,奶茶的种类多时,整个类 就过于耦合。为了降低耦合性,我们想到了简单的工厂模式。
二.简单工厂模式
为了使我们增加其他种类奶茶的时候不需要对父类进行修改,我们增加了奶茶工厂类。
class MilkTea{string name;
public:MilkTea(string _name):name(_name){}virtual create()=0;
}class 红枣奶茶:public MilkTea{
public:红枣奶茶(string _name){MilkTea(_name);}void create(){制作了一杯红枣奶茶!}
}......class 柠檬水:public MilkTea{
public:柠檬水(string _name){MilkTea(_name);}void create(){制作了一杯柠檬水!}} class MilkFactory{
public:MilkFactory *create(string TeaName){catch(TeaName){case 红枣奶茶:return new 红枣奶茶(TeaName);case ...break;}}
}
(看起来好像比传统模式的代码多了,但在实际情况下,传统模式代码并不少,并且耦合性非常高,不利于实际开发中的增删改查)在这里我们不添加所有属性,可以看到我们想增加一种奶茶时,并不需要修改原来的MilkTea类,只需要添加相应的奶茶类,然后在工厂中添加部分代码即可。但是此时又出现问题,就是我们每次增加一种奶茶,都需要增加一个具体类和实现工厂,当奶茶成倍增加时,在一定程度上增加了系统复杂度,也增加了系统具体类的依赖。