由简单工厂、工厂、策略模式引发的思考

“策略是事件的策略,工厂是方法的工厂。”设计模式的名都是有故事的

此话怎讲?

在做计算器的练习中我们用到的是简单工厂模式,具体代码可参考《大话设计模式》这本书,来看思路。

计算器要想实现计算这件事需要4个“人”的参与:两个运算数字、一个算符(+ - * /)、一个结果。

用初学者的方式就是将这4个“人”排好队,用if语句对应计算就OK了,没毛病。但是多个if语句的使用违背了编程的一个原则:单出入口原则。这时候我们马上会想到用case语句,但如果我想在原有算符的基础上扩展,要在case语句里增加分支,在维护时不小心动了别的地方的代码那就完了。这时候就得想着让代码间互相影响变小了吧——这叫降低耦合度。怎样降,想一下活字印刷术的原理秒懂。

后面要面临的问题重点就该在增加算符上了,想一下每个算符都会包含那4个参与者,减少代码的冗余,那就把他们抽象到父类中吧,这时要是想增加算符只需要增加具体的算符类就行,像活字印刷术了吧。然后就是实例化的问题了,简单工厂该登场了,它做的事是根据输入的算符对应生产(实例化)相应的计算方法,在计算方法里只负责怎样就算,分工明确了。此时,算法类里只有算法,工厂类里负责确认算符,对应实例化相应算法,客户端负责传送人想要的操作。分工明确、办事高效、扩展性高。

工厂负责生产——实例化算法,也就是生产的是方法,嗯,“工厂是方法的工厂”

从工厂的角度想,使用case语句对应生产算法了,要想让工厂扩展性高点,不用每次增加算符都要在case语句里加分支怎样做。能不能让每个具体算法都对应工厂里一个具体算法的工厂呢,也就是大工厂作为抽象父类,具体算法的小工厂继承父类?当然可以,这时这个简单工厂就变成一个不简单的工厂了,叫工厂模式。

至于策略模式,策略使用的对象是事,针对事采取的方法叫策略。书中又是用的计算的例子,做商场结算的程序,要有促销。类的思想就不说了,单说它是怎么实现的。程序所做的这件事可以直接实现,但这样耦合度高,扩展性低,还是想活字印刷的思想,此时只是把分块用到了整件事上:

客户端、运算端、承接两者的消息传递者

看到了啥——运算端,有运算是不是可以用上边的简单工厂来实现,对,这就是终版代码,策略与简单工厂相结合。

“策略是事件的策略“讲的通了吧。

猜你喜欢

转载自blog.csdn.net/qq_41026669/article/details/88613747