设计模式--工厂方法
简介
在简单工厂方法中,当增加新的产品时需要对简单工厂类修改或者创建多个简单工厂类。工厂方法进一步的解耦,把工厂类抽象,不再负责所有实例的创建,而是把具体的创建工作交给子类去完成,实例化延迟到子类加载,由子类决定要实例化的类
工厂方法的核心是一个抽象工厂类,而不像简单工厂模式,把核心放在一个实类上

- 抽象产品角色(Product):定义产品的接口或者抽象类
- 具体产品角色(ProductA/ProductB) :实现接口Product的具体子产品类
- 抽象工厂角色(Facotry) :声明工厂方法(display()),返回一个产品
- 真实的工厂(ProductAFactory/ProductBFactory):实现工厂方法(display()),由客户端调用,返回一个子产品的实例
实现
- 产品接口
-
public interface Product { void display(); }
-
- 产品接口实现子类
- 产品A类
public class ProductA implements Product{ @Override public void display() { System.out.println("This is product A"); } } - 产品B类
public class ProductB implements Product{ @Override public void display() { System.out.println("This is product B"); } }
- 产品A类
- 工厂接口
-
public interface Factory { Product createProduct(); }
-
- 工厂接口的实现子类
- 产品A工厂类
public class ProductAFactory implements Factory{ @Override public Product createProduct() { return new ProductA(); } } - 产品B工厂类
public class ProductBFactory implements Factory{ @Override public Product createProduct() { return new ProductB(); } }
- 产品A工厂类
- 测试
-
public class Test { public static void main(String[] args) { Product productA = new ProductAFactory().createProduct(); Product productB = new ProductBFactory().createProduct(); productA.display(); productB.display(); } }This is product A This is product B
-
优势和缺点
优势:
- 工厂方法模式对客户端隐藏了具体产品类被实例化细节,甚至无须知道具体产品类的类名,只需要关心所需产品对应的工厂
- 加入新产品时,只要添加一个具体工厂和具体产品就可以了,无需修改原先已有的产品和其他工厂方法。提高了系统的可扩展性,符合“开闭原则”
缺点:
- 加入新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度
应用场景
- 一个类无需知道它所需要的具体的对象类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂类即可,具体产品对象由具体工厂类创建
- 一个类通过其子类来指定创建哪个对象:在工厂方法模式中,对于父工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,提高系统的可扩展性
Java 中应用实例
Java 程序库中有该模式的应用:
java.util.Calendar#getInstance()
识别方法: 工厂方法可通过构建方法来识别, 它会创建具体类的对象, 但以抽象类型或接口的形式返回这些对象

浙公网安备 33010602011771号