工厂方法模式
引言:
顾名思义,工厂方法模式,指的就是使用工厂类,让工厂类代替创建一些产品类实例。
在讲述工厂方法之前,先来认识一下简单工厂模式。
简单工厂
简单工厂模式不属于23种模式之一,但是其较为直接简单,利与我们对工厂方法模式的理解。我们可以先查看其类图。
简单工厂模式十分的直接,只需要定义一个通用的创建接口或者是抽象类,让具体产品类去实现它。继而,定义一个工厂,让工厂做出判断是需要创建某种产品类。最后客户端调用者直接调用工厂来创建即可。
// 定义抽象产品类
abstract class Product {
public abstract void use();
}
// 定义具体产品类A
class ConcreteProductA extends Product {
public void use() {
System.out.println("使用产品A");
}
}
// 定义具体产品类B
class ConcreteProductB extends Product {
public void use() {
System.out.println("使用产品B");
}
}
// 定义工厂类
class Factory {
public static Product createProduct(String type) {
if (type.equals("A")) {
return new ConcreteProductA();
} else if (type.equals("B")) {
return new ConcreteProductB();
} else {
return null;
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Product productA = Factory.createProduct("A");
productA.use(); // 输出:使用产品A
Product productB = Factory.createProduct("B");
productB.use(); // 输出:使用产品B
}
}
简单工厂使用场景如下:
- 工厂负责创建的对象较为少
- 客户无需关心创建逻辑
优点:避免直接创建实体类,减低耦合性 缺点:违反开闭原则,不利于做产品类的拓展。
工厂方法模式
在上述简单工厂模式的基础下,我们让其符合开闭原则,并变得易于拓展,即为工厂方法模式了。
具体类图如下:
工厂方法模式,在工厂处也使用到抽象,这样子使得客户端在调用的时候,连输入值都无需传入了,也使得类与类之间更加的解耦。这么处理让各其符合了开闭原则,需要做出拓展时候,再创建一个新的工厂类即可,而依旧禁止对修改的处理。
// 定义抽象产品类
abstract class Product {
public abstract void use();
}
// 定义具体产品类A
class ConcreteProductA extends Product {
public void use() {
System.out.println("使用产品A");
}
}
// 定义具体产品类B
class ConcreteProductB extends Product {
public void use() {
System.out.println("使用产品B");
}
}
// 定义抽象工厂类
abstract class Factory {
public abstract Product createProduct();
}
// 定义具体工厂类A
class ConcreteFactoryA extends Factory {
public Product createProduct() {
return new ConcreteProductA();
}
}
// 定义具体工厂类B
class ConcreteFactoryB extends Factory {
public Product createProduct() {
return new ConcreteProductB();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.use(); // 输出:使用产品A
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.use(); // 输出:使用产品B
}
}
工厂模式在继承简单工厂模式的优点,把不符合开闭原则的缺点解决了,使其成为一个典型的设计模式。
参考
《Android进阶之光》