假设你开个汉堡店。
你写了一个汉堡基类 -- 因为有辣鸡翅汉堡、有甜圈汉堡、有咸鱼汉堡等等。
完成一个汉堡,有原材料准备prepare、烘烤bake、以及包装package等过程。所有的汉堡制作都要经历这个过程。这些方法在基类中声明。所有的汉堡类都继承并Override这些方法。
现在你要写一个订购汉堡的函数,如果有客户要订购汉堡,调这个订购函数就可以了。问题是有各种各样的汉堡。于是,根据汉堡的类型,你需要new不同的汉
堡。但是,除了new之外所有的代码都是一样的:原料准备,烘烤,包装。只要知道是什么类型的汉堡,那种类型的汉堡就知道怎么完成整个过程(嗯,虚函
数)。
-
void order_hamburger(string& HB_type)
-
{
-
Hamburger* hb;
-
if (HB_type == 辣鸡) {
-
hb = new 辣鸡汉堡;
-
} else if (HB_type == 咸鱼) {
-
hb = new 咸鱼汉堡;
-
} else if () {
-
...
-
}
-
-
hb->prepare();
-
hb->bake();
-
hb->package();
-
}
复制代码
你
写了一大堆if
else。这可不好,一旦汉堡的种类有变化,你就得重新维护order_hamburger方法。不止order_hamburger,还有类似于
order_hamburger这种根据类型来判断new什么对象的方法 -- 你都需要重写。可能复制粘贴是个好办法...
稍微好一点的,就是写一个工厂类,里面放一个工厂方法:
-
class HBFactory {
-
Hamburger* createHB(string& HB_type)
-
{
-
Hamburger* hb;
-
if (HB_type == 辣鸡) {
-
hb = new xxx;
-
} else if ( ) {
-
...
-
}
-
...
-
return hb;
-
}
-
};
复制代码
这样,order_hamberger就可以这样写了:
-
order_hamburger(string& HB_type)
-
{
-
HBFactory HBfactory;
-
Hamburger* hb = HBfactory.createHB(HB_type);
-
-
hb->prepare();
-
hb->bake();
-
hb->package();
-
}
复制代码
order_hamburger方法永远不需要变动。一旦有改变,改变那个Factory就可以了。
你说,这不过是把if-else移到HBFactory里面而已。没错,只是类似于order_hamburger的方法都可以使用这个工厂,所以避免了代码重复。所有的if-else变化,都统一放到这个工厂类的工厂方法里了。
这使得,代码可能变化的部分被独立出来。独立到这个工厂类中了。设计模式中所谓“封装变化”,就是指将变化的部分独立出来,这样一旦有变化发生,改动一处就可以了,而不是处处复制粘贴,一旦疏忽就出错。
嗯,上面的就是简单工厂类了(不是GOF收录的设计模式,只是常用而已)。工厂方法模式,就是在基类中定义一个工厂方法,所有的继承类都重写这个工厂方法,由子类来决定究竟实例化哪一个。抽象工厂模式,则可以创建交叉的产品族。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28140453/viewspace-1308869/
,如需转载,请注明出处,否则将追究法律责任。