前一篇文章写了简单工厂模式和工厂方法模式:
https://blog.csdn.net/bluerheaven/article/details/106226936
又是一个工厂模式:抽象工厂模式。23种设计模式中有3个工厂模式,傻傻分不清楚
抽象工厂模式的定义:
为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类。
这个设计模式的重点在于不需要指定它们的具体类:关键在于面向产品的接口编程,使用时并不知道具体实现是什么。
画一下UML类图:
AbstractFactory:抽象工厂角色,它声明了一组用于创建一种产品的方法,每一个方法对应一种产品,如上述类图中的AbstractFactory中就定义了两个方法,分别创建产品A和产品B。
ConcreteFactory:具体工厂角色,它实现了再抽象工厂中定义的创建产品的方法,生成一组具体产品,这些产品构成了一个产品种类,每一个产品都位于某个产品等级结构中,如上述类图中的ConcreteFactory1和ConcreteFactory2.
AbstractProduct:抽象产品角色,它为每种产品声明接口,比如上述类图中的AbstractProductA和AbstractProductB。
ConcreteProduct:具体产品角色,它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法,如上述类图中的ConcreteProductA1、ConcreteProductA2、ConcreteProductB1和ConcreteProductB2。
比如使用抽象工厂模式生产一辆汽车:
抽象产品类:轮胎、发动机、车窗等
具体产品类1:普通轮胎、普通发动机、普通车窗等
具体产品类2:越野轮胎、汽油发动机、防弹车窗等
抽象工厂类:生产轮胎、发动机、车窗等
具体工厂类1:生产普通轮胎、生产普通发动机、生产普通车窗等
具体工厂类2:生产越野轮胎、生产汽油发动机、生产防弹车窗等
它是为一组相关或者说相互依赖的对象提供一个接口。
写一下具体的代码吧。
抽象工厂类:
public abstract class AbstractFactory {
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProductB();
}
具体工厂类:
public class ConcreteFactory1 extends AbstractFactory {
@Override public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
@Override public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
public class ConcreteFactory2 extends AbstractFactory {
@Override public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
@Override public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}
抽象产品类:
public abstract class AbstractProductA {
public abstract void method();
}
public abstract class AbstractProductB {
public abstract void method();
}
具体产品类:
public class ConcreteProductA1 extends AbstractProductA {
@Override public void method() {
System.out.println("具体产品类A1");
}
}
public class ConcreteProductA2 extends AbstractProductA {
@Override public void method() {
System.out.println("具体产品类A2");
}
}
public class ConcreteProductB1 extends AbstractProductB {
@Override public void method() {
System.out.println("具体产品类B1");
}
}
public class ConcreteProductB2 extends AbstractProductB {
@Override public void method() {
System.out.println("具体产品类B2");
}
}
使用时:
public class Client {
public static void main(String[] args) {
AbstractFactory factory1 = new ConcreteFactory1();
AbstractFactory factory2 = new ConcreteFactory2();
AbstractProductA productA1 = factory1.createProductA();
AbstractProductB productB1 = factory1.createProductB();
AbstractProductA productA2 = factory2.createProductA();
AbstractProductB productB2 = factory2.createProductB();
productA1.method();
productB1.method();
productA2.method();
productB2.method();
}
}
抽象工厂方法在使用时,面对抽象类编程,并不知道具体实现是什么。这样在修改时,就可以实现只修改创建的具体工厂类对象,而不需要修改代码的使用逻辑。
这篇对抽象产品模式的定义进行咬文嚼字,整篇都在解释定义,但是咬文嚼字才能真正地区分出它和工厂方法模式的区别~
参考资料:《Android源码设计模式》、《大话设计模式》