上次说到简单工厂模式。也说到了简单工厂模式的缺点,在增加内容的时候,需要修改简单工厂的逻辑,增加内容。
这显然是违反设计原则中的“开闭原则”的。回忆一下开闭原则是什么呢?就是对拓展开放,对修改封闭。但是这种方式显然是没办法拓展了。
所以,还是需要更先进的工厂模式。
当然设计模式并没有优劣之分的,用一位大神的话说,所谓设计模式就是为了偷懒的产物,它可以让我们更好的维护我们的代码,当我们增加或修改某些内容的时候,不需要废太大的力气。
如果,你感觉一种设计模式会增加你的工作量,那么你一定是用错了。
很赞同大神的观点。
不过像之前的模式中,确实需要一遍一遍的修改工厂类,确实麻烦。
接下来,结合自己所学,说说工厂模式。
工厂模式就是把众多的内容提炼出一个具有N多共性的工厂虚类,而对象的实现则放在这个工厂虚类的具体子类中。客户端调用的时候,只要使用虚类接收子类的对象,就可以为所欲为了。呃,也不算为所欲为吧,换个说法,做可以做的事吧。我是这么理解的。No code No 理解。咱们看代码。
工厂模式要有几个内容:
1、工厂虚类(要有子类工厂的特性)
2、继承虚类的具体子类
3、产品虚类(要有产品子类的特性)
4、继承产品虚类的具体子类
// 产品虚类
public abstract class Food
{
public abstract string GetFood();
}
// 产品子类1
public class Yuanweiji : Food
{
public override string GetFood()
{
return "原味鸡";
}
}
// 产品子类2
public class Danta : Food
{
public override string GetFood()
{
return "蛋挞";
}
}
// 工厂虚类
public abstract class Cooker
{
public abstract Food CreateFood();
}
// 工厂子类1
public class YuanweijiCooker : Cooker
{
public override Food CreateFood()
{
return new Yuanweiji();
}
}
// 工厂子类2
public class DantaCooker : Cooker
{
public override Food CreateFood()
{
return new Danta();
}
}
然后,客户端这样进行调用
// 用工厂虚类对象接收原味鸡工厂子类的对象,这样就得到了原味鸡工厂
Cooker yuanweijiCooker = new YuanweijiCooker();
// 用产品虚类对象接收原味鸡子类的对象,就可以得到原味鸡了
Food yuanweiji = yuanweijiCooker.CreateFood();
// 最后输出,看你得到的是不是原味鸡,别给错了
Response.Write(yuanweiji.GetFood() + "<br/>");
这样,如果我要增加一种产品奥尔良鸡腿堡,就只要在增加一个产品子类和一个工厂子类
// 产品子类3
public class Aoerliang : Food
{
public override string GetFood()
{
return "奥尔良鸡腿堡";
}
}
// 工厂子类3
public class AoerliangCooker : Cooker
{
public override Food CreateFood()
{
return new Aoerliang();
}
}
然后客户端按照之前的方式调用就可以了。
Cooker aoerliangCooker = new AoerliangCooker();
Food aoerliang = aoerliangCooker.CreateFood();
Response.Write(aoerliang.GetFood() + "<br/>");
这样是不是就增加了程序的可维护性呢?而不需要增加一个产品就修改一下工厂类。这样真的方便很多不是么?
知行办公,专业移动办公平台
https://zx.naton.cn/
【总监】十二春秋之,3483099@qq.com;
【Master】zelo,616701261@qq.com;
【运营】运维艄公,897221533@qq.com;
【产品设计】流浪猫,364994559@qq.com;
【体验设计】兜兜,2435632247@qq.com;
【iOS】淘码小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com;
【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com;
【java】首席工程师MR_W,feixue300@qq.com;
【测试】土镜问道,847071279@qq.com;
【数据】fox009521,42151960@qq.com;
【安全】保密,你懂的。