《设计模式》从Simple看SimpleFactory的演变

从Simple看SimpleFactory的演变

以《大话设计模式》书为参考,Simple指的是书中第6-7页的代码实例,SimpleFactory(简单工厂)指的是书中第9-11页的代码实例。

以下内容从不同的角度去对比Simple和SimpleFactory的代码差别以及编程思想上的变化。

为什么要用面向对象三要素来理解设计模式?

面向对象和设计模式,都是从生活中抽象来的(面向对象:一切万物皆对象;设计模式借鉴于建筑工程建设模式),面向对象是生活抽象的基础组件,设计模式是对面向对象(封装、继承、多态)的应用。

封装

Simple SimpleFactory
根据加减乘除四个业务逻辑代码,封装到了一个方法中,具体代码表示如下:Operation类的GetResult方法
《设计模式》从Simple看SimpleFactory的演变_第1张图片
根据加减乘除四个业务逻辑代码,抽象出一个Operation类,把不变的部分封装成类,具体代码表示如下:
《设计模式》从Simple看SimpleFactory的演变_第2张图片

总结:封装解耦合
当需要扩充业务的时候,由于Simple中“加减乘除”业务逻辑代码的强耦合,会使得任何代码改动都将严重影响其他业务逻辑代码
而在SimpleFactory中由于抽象出来一个运算类,使得“加减乘除”业务逻辑分别可以被封装到不同的类中,消灭了“加减乘除”业务逻辑代码相互之间的耦合。
也就是通过(抽象)封装,尽量将固定不变的东西封装起来,将变化隔离在外。


继承

Simple SimpleFactory
Simple中是没有继承的,它是为了更好的复用加减乘除业务逻辑,把逻辑封装到了Operation类的GetResult方法中。 SimpleFactory中充分的体现了OOP的继承思想,主要代码如下:
运算类Operation为基(父)类,OperationAdd等分别继承Operation类,为子类。
《设计模式》从Simple看SimpleFactory的演变_第3张图片
《设计模式》从Simple看SimpleFactory的演变_第4张图片

总结:通过新增子类来应对新增业务需求
通过对比,SimpleFactory的“加减乘除”运算子类分别在重写自己的GetResult方法来实现各自不同的业务逻辑。
如果新增一个业务,可以通过新增一个运算子类来实现,具体新增的业务逻辑代码只需要写在新增运算子类的GetResult方法中,对其他已有的“加减乘除”业务逻辑代码没有干扰。


多态

Simple SimpleFactory
非常丰富

详细对比过程如下:
在SimpleFactory中多态的体现,由以下几点组成:
1. createOperate方法返回类型为父类Operation类。
2. createOperate方法中的第一行代码定义了一个Operation对象 oper,即:
Operation oper = null;
oper对象在createOperate方法的最后一行被返回。
3. createOperate方法中,根据传入的operate参数不同,来实例化不同的运算类对象,如下:
case “+”:
//直接体现多态思想的就是这行代码。
oper = new OperationAdd();
//根据业务不同,实例化不同的运算子类后赋值给父类实例oper,并被返回给方法调用方。


简单运算工厂类代码,如下:

《设计模式》从Simple看SimpleFactory的演变_第5张图片
总结:多态的精妙之处在于再一次的将“不变”的东西“封装”起来。具体代码展示如下:
1. createOperate方法的返回类型为父类Operation类,Operation类是封装好,基本不变的东西。
2. Operation oper = null;
Return oper;
在createOperate方法中首尾两行代码,是基本不变的。
3. createOperate方法中应对变化的部分,就是Switch case,变化意味着“风险”,解决的办法就是继续解耦合,去掉这种变化的代码。

将“变化”隔离开

以上部分,从OO(面向对象)的三要素入手,分析了在封装、继承、多态方面,Simple和SimpleFactory的差异,通过对比这些差异,能够看出SimpleFactory的编程思想上有一个非常大的优势,那就是发现了最初在Simple中的“加减乘除”运算的逻辑代码(强耦合)中新增业务逻辑代码会给Simple带来灾难性的新问题。(因为“加减乘除”代码之间存在强耦合,所以扩展会带来代码的不稳定)。

SimpleFactory 的编程思路一直都是在想办法抽象出来固定不变的东西,进而来支持变化。

很显然,在SimpleFactory已经通过新增Operation子类来实现新业务扩展,但在OperationFactory类的createOperate方法中依然存在Operation子类之间的耦合(相比Simple而言,这里的耦合性弱很多),switch case的这种耦合结构对业务扩展带来的代码变化,依然意味着“变化和风险”,还需要进一步的把这部分“变化和风险”隔离到OperationFactory类的外面去。

你可能感兴趣的:(设计模式思想,设计模式,面向对象编程,多态,封装)