概述
工厂方法模式是创建型设计模式的一种,定义一个用于创建对象的接口,让子类决定实例化那个类,工厂方法使一个类的实例化延迟到其子类
工厂方法模式也叫工厂模式或虚拟构造器模式,在工厂方法模式中,一个工厂父类包含多个工厂子类,父类定义接口,子类负责创建具体的产品对象.
UML
- 抽象工厂(Creator) : 工厂方法模式的核心
- 具体工厂(ConcreateCreator) : 实现了具体的业务逻辑
- 抽象产品(Product) : 工厂方法模式所创建的产品的父类
- 具体产品(ConcreateProduct) : 实现抽象产品的某个具体产品对象
使用场景
- 在任何需要生成复杂对象的地方,都可以使用工厂方法模式,复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式
实例
工厂方法模式分为三种,普通工厂模式,多个工厂方法模式,静态工厂方法模式,其实在工厂方法模式中还有一种特例,叫做简单工厂模式(或者静态工厂方法模式),
静态工厂模式是Effective Java
第一条推荐的创建对象的方式,静态工厂方法常见于我们的工具类,如TextUtil等,
普通工厂模式实例代码
//抽象产品
public interface Product {
}
//具体产品类
//具体产品类
public class ConcreteProductA implements Product {
public ConcreteProductA() {
System.out.println("method: -->我是具体的产品A");
}
}
public class ConcreteProductB implements Product {
public ConcreteProductB() {
System.out.println("method: -->我是具体的产品B");
}
}
// 抽象工厂类
public abstract class Factory {
public abstract Product createProduct();
}
// 具体工厂类
public class ConcreteFactory extends Factory {
@Override public Product createProduct() {
return new ConcreteProductA();
}
}
//客户端调用代码
public class Test {
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
Product product = factory.createProduct();
}
}
多个工厂方法模式
多个方法工厂模式是普通工厂方法模式的升级版,就是工厂中提供多个方法
public class MoreMethodConcreteFactory extends MoreMethodFactory {
@Override
public Product createProducA() {
return new ConcreteProductA();
}
@Override
public Product createProductB() {
return new ConcreteProductB();
}
}
静态工厂方法模式
在多个工厂方法模式的基础上进一步改造
public class StaticFactory{
public static Product createProducA(){
return new ConcreteProductA();
}
public static Product createProductB(){
return new ConcreteProductB();
}
}
这样的话,客户端的调用就不需要创建工厂对象了
Product productA = StaticFactory.createProductA();
Product productB = StaticFactory.createProductB();
优缺点
优点
- 良好的封装性和清晰的代码结构,不需要知道对象的创建过程,降低模块间的耦合.
- 优秀的拓展性,如果需要增加产品,只需要拓展一个工厂类即可,很好的拥抱了变化.
- 屏蔽产品类,产品类的任何变化,客户端都不需要关心,只需要关注产品接口即可.
- 解耦,高层模块只需要知道产品的抽象类,不需要关心其实现
缺点
- 结构复杂化,每次添加新产品时,都需要编写一个新的产品类.同时还要引入其抽象层,导致结构变得复杂,因此在特定场景是否使用工厂方法模式还需设计者权衡利弊了
- 一个工厂只能创建一种产品.