一、抽象工厂模式
抽象工厂模式(Abstract Factor Pattern)是创建型设计模式之一。它和之前的工厂设计模式很像。之前的工厂设计模式中如果一个工厂只能生产一种它具体的产品。而抽象工厂设计模式可以用一个工厂类生产一系列相关的产品。
为创建一组相关或者相互依赖的对象提供一个接口,而不需要指定它们的具体类
二、UML类图
三、实例解读
下面笔者用一个手机生产商生产手机配件的示例来解读上面这个类图。
具体数据都是乱编的,不要过于纠结[啧啧啧]
1.手机工厂用于生产屏幕和处理器两种配件 -对应类图的AbstractFactory
public abstract class PhoneFacory {
public abstract ICpu createCpu();
public abstract IScreen createScreen();
}
2.处理器和屏幕的接口 --分别对应类图的 AbstractProduct1 和 AbstractProduct2
public interface ICpu {
void cpu();
}
public interface IScreen {
void sreen();
}
3.具体的处理器和屏幕 --对应 ConcreteProduct1 和 ConcreteProduct1
public class GaoTongCpu implements ICpu {
@Override
public void cpu() {
System.out.println("高通骁龙处理器");
}
}
public class QiLingCpu implements ICpu {
@Override
public void cpu() {
System.out.println("麒麟处理器");
}
}
public class ShengHuaScreen implements IScreen {
@Override
public void sreen() {
System.out.println("胜华屏幕");
}
}
public class KangNingSreeen implements IScreen {
@Override
public void sreen() {
System.out.println("康宁大猩猩玻璃");
}
}
4.具体的手机生产商 --对应类图的 ConcreteFactory1 和 ConcreteFactory2
public class XiaoMiFactory extends PhoneFacory{
@Override
public ICpu createCpu() {
return new QiLingCpu();
}
@Override
public IScreen createScreen() {
return new KangNingSreeen();
}
}
public class IphoneFactory extends PhoneFacory{
@Override
public ICpu createCpu() {
return new GaoTongCpu();
}
@Override
public IScreen createScreen() {
return new ShengHuaScreen();
}
}
5.用一个客户端类生产产品
public class Client {
public static void main(String[] args) {
PhoneFacory phoneFacory = new XiaoMiFactory();
phoneFacory.createCpu().cpu();;
phoneFacory.createScreen().sreen();;
System.out.println("------------");
PhoneFacory phoneFacory2=new IphoneFactory();
phoneFacory2.createCpu().cpu();;
phoneFacory2.createScreen().sreen();;
}
}
运行结果:
麒麟处理器
康宁大猩猩玻璃
------------
高通骁龙处理器
胜华屏幕
从Client类可以看出并没有用到具体的产品类,而是用一个具体工厂把这两个有相关性的产品封装起来,而这个具体的工厂,也用了一个抽象类抽象出来,最终只需要创建这个抽象类的对象就能生产一系列的产品了。
四、总结
它的一个显著的优点是分离接口与实现,客户端使用抽象工厂创建需要的对象时不需要具体的实现是谁,把具体的产品解耦出去,使在切换产品类是更加灵活和容易。但它也有一个明显的缺点,不太容易扩展新的类,因为添加一个产品类就需要修改抽象工厂和对应的具体工厂,并且这还会导致文件类的增加较多。所以在实际使用时要权衡利弊。