1700476139
设计模式之禅 29.4 最佳实践
1700476140
1700476141
大家对类的继承有什么看法吗?继承的优点有很多,可以把公共的方法或属性抽取,父类封装共性,子类实现特性,这是继承的基本功能。缺点有没有?有!即强侵入,父类有一个方法,子类也必须有这个方法。这是不可选择的,会带来扩展性的问题。我举个简单的例子来说明:Father类有一个方法A,Son继承了这个方法,然后GrandSon也继承了这个方法,问题是突然有一天Son要重写父类的这个方法,他敢做吗?绝对不敢!GrandSon要用从Father继承过来的方法A,如果你修改了,那就要修改Son和GrandSon之间的关系,那这个风险就太大了!
1700476142
1700476143
这里讲的这个桥梁模式就是这一问题的解决方法,桥梁模式描述了类间弱关联关系,还说上面的那个例子,Father类完全可以把可能会变化的方法放出去,Son子类要拥有这个方法很简单,桥梁搭过去,获得这个方法,GrandSon也一样,即使你Son子类不想使用这个方法也没关系,对GrandSon不产生影响,它不是从Son中继承来的方法!
1700476144
1700476145
不能说继承不好,它非常好,但是有缺点,我们可以扬长避短,对于比较明确不发生变化的,则通过继承来完成;若不能确定是否会发生变化的,那就认为是会发生变化,则通过桥梁模式来解决,这才是一个完美的世界。
1700476146
1700476147
1700476148
1700476149
1700476151
设计模式之禅 第三部分 谁的地盘谁做主——设计模式PK
1700476152
1700476154
第30章 创建类模式大PK
1700476155
1700476156
创建类模式包括工厂方法模式、建造者模式、抽象工厂模式、单例模式和原型模式,它们都能够提供对象的创建和管理职责。其中的单例模式和原型模式非常容易理解,单例模式是要保持在内存中只有一个对象,原型模式是要求通过复制的方式产生一个新的对象,这两个不容易混淆。剩下的就是工厂方法模式、抽象工厂模式和建造者模式了,这三个之间有较多的相似性。
1700476157
1700476159
30.1 工厂方法模式VS建造者模式
1700476160
1700476161
工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步的精确构造创建出一个复杂的对象。我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方法模式,直接产生出来的就是一个力大无穷、能够飞翔、内裤外穿的超人;而如果使用建造者模式,则需要组装手、头、脚、躯干等部分,然后再把内裤外穿,于是一个超人就诞生了。纯粹使用文字来描述比较枯燥,我们还是通过程序来更加清晰地认识两者的差别。
1700476162
1700476163
30.1.1 按工厂方法建造超人
1700476164
1700476165
首先,按照工厂方法模式创建出一个超人,类图如图30-1所示。
1700476166
1700476167
1700476168
1700476169
1700476170
图30-1 按工厂方法建造超人
1700476171
1700476172
类图中我们按照年龄段把超人分为两种类型:成年超人(如克拉克、超能先生)和未成年超人(如Dash、Jack)。这是一个非常正宗的工厂方法模式,定义一个产品的接口,然后再定义两个实现,通过超人制造工厂制造超人。想想看我们对超人最大印象是什么?当然是他的超能力,我们以specialTalent(特殊天赋)方法来代表,先看抽象产品类,如代码清单30-1所示。
1700476173
1700476174
代码清单30-1 超人接口
1700476175
1700476176
public interface ISuperMan{
1700476177
1700476178
//每个超人都有特殊技能
1700476179
1700476180
public void specialTalent();
1700476181
1700476182
}
1700476183
1700476184
产品的接口定义好了,我们再来看具体的产品。先看成年超人,很简单,如代码清单30-2所示。
1700476185
1700476186
代码清单30-2 成年超人
1700476187
[
上一页 ]
[ :1.700476138e+09 ]
[
下一页 ]