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
1700476188
public class AdultSuperMan implements ISuperMan{
1700476189
1700476190
//超能先生
1700476191
1700476192
public void specialTalent(){
1700476193
1700476194
System.out.println(“超人力大无穷”);
1700476195
1700476196
}
1700476197
1700476198
}
1700476199
[
上一页 ]
[ :1.70047615e+09 ]
[
下一页 ]