1700457606
当我们在做一个比较复杂的项目时,经常会遇到初始化一个对象很耗费精力的情况,所有的产品类都放到一个工厂方法中进行初始化会使代码结构不清晰。例如,一个产品类有5个具体实现,每个实现类的初始化(不仅仅是new,初始化包括new一个对象,并对对象设置一定的初始值)方法都不相同,如果写在一个工厂方法中,势必会导致该方法巨大无比,那该怎么办?
1700457607
1700457608
考虑到需要结构清晰,我们就为每个产品定义一个创造者,然后由调用者自己去选择与哪个工厂方法关联。我们还是以女娲造人为例,每个人种都有一个固定的八卦炉,分别造出黑色人种、白色人种、黄色人种,修改后的类图如图8-4所示。
1700457609
1700457610
1700457611
1700457612
1700457613
图8-4 多个工厂类的类图
1700457614
1700457615
每个人种(具体的产品类)都对应了一个创建者,每个创建者都独立负责创建对应的产品对象,非常符合单一职责原则,按照这种模式我们来看看代码变化。
1700457616
1700457617
多工厂模式的抽象工厂类如代码清单8-15所示。
1700457618
1700457619
代码清单8-15 多工厂模式的抽象工厂类
1700457620
1700457621
public abstract class AbstractHumanFactory{
1700457622
1700457623
public abstract Human createHuman();
1700457624
1700457625
}
1700457626
1700457627
注意 抽象方法中已经不再需要传递相关参数了,因为每一个具体的工厂都已经非常明确自己的职责:创建自己负责的产品类对象。
1700457628
1700457629
黑色人种的创建工厂如代码清单8-16所示。
1700457630
1700457631
代码清单8-16 黑色人种的创建工厂实现
1700457632
1700457633
public class BlackHumanFactory extends AbstractHumanFactory{
1700457634
1700457635
public Human createHuman(){
1700457636
1700457637
return new BlackHuman();
1700457638
1700457639
}
1700457640
1700457641
}
1700457642
1700457643
黄色人种的创建工厂如代码清单8-17所示。
1700457644
1700457645
代码清单8-17 黄色人种的创建类
1700457646
1700457647
public class YellowHumanFactory extends AbstractHumanFactory{
1700457648
1700457649
public Human createHuman(){
1700457650
1700457651
return new YellowHuman();
1700457652
1700457653
}
1700457654
1700457655
}
[
上一页 ]
[ :1.700457606e+09 ]
[
下一页 ]