抽象工厂模式
例子背景:
随着Ipone手机的销售火热。同时在**组装**Ipone手机的时候我们需要考虑到手机壳,手机其他配件等其他配件的匹配组装。于是这个工厂开始生产手机壳和其余手机配件,用来组装手机。这时候工厂有两个系列的产品:手机壳和其余配件。Iphone7系列配置A型号手机壳和A型号其余配件,Iphone8系列配置B型号手机壳和B型号其余配件。
概念:
抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。比如Iphone7系列使用A型号手机壳和A型号其余配件,而Iphone8系列使用B型号手机壳和B型号其余配件。那么使用抽象工厂模式,在为Iphone7系列生产相关配件时,就无需制定配件的型号,它会自动根据手机型号生产对应的配件型号A。
当每个抽象产品都有多于一个的具体子类的时候(手机壳有型号A和B两种,其余手机配件也有型号A和B两种),工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品(产品手机壳有两个具体产品手机壳A和手机壳B)。抽象工厂模式提供两个具体工厂角色(Iphone7系列工厂和Iphone8系列工厂),分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
产品类:
//手机壳以及型号
public interface PhoneCase {
}
public class PhoneCaseA implements PhoneCase {
public PhoneCaseA() {
System.out.println("制造-->PhoneCase");
}
}
public class PhoneCaseB implements PhoneCase {
public PhoneCaseB() {
System.out.println("制造-->PhoneCaseB");
}
}
//其余手机配件以及型号
public interface Debris {
}
public class DebrisA implements Debris {
public DebrisA() {
System.out.println("制造-->DebrisA");
}
}
public class DebrisB implements Debris {
public DebrisB() {
System.out.println("制造-->DebrisB");
}
}
工厂类:
//创建工厂的接口
public interface AbstractFactory {
//制造手机壳
public PhoneCase createPhoneCase();
//制造其余配件
public Debris createDebris();
}
//为Iphone7系列生产配件
public class FactoryIphone7 implements AbstractFactory {
@Override
public PhoneCase createPhoneCase() {
return new PhoneCaseA();
}
@Override
public Debris createDebris() {
return new DebrisA();
}
}
//Iphone8系列
public class FactoryIphone8 implements AbstractFactory {
@Override
public PhoneCase createPhoneCase() {
return new PhoneCaseB();
}
@Override
public Debris createDebris() {
return new DebrisB();
}
}
客户类:
public class Customer {
public static void main(String[] args) {
//生产Iphone7系列配件
FactoryIphone7 factoryIphone7 = new FactoryIphone7();
factoryIphone7.createPhoneCase();
factoryIphone7.createDebris();
//生产Iphone8系列配件
FactoryIphone8 factoryIphone8 = new FactoryIphone8();
factoryIphone8.createPhoneCase();
factoryIphone8.createDebris();
}
}
总结:
在使用时,经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使得提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。