能够实现轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程呢
工厂模式分为两类:工厂方法模式(包括简单工厂模式)与抽象工厂模式
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
简单工厂模式
// 产品类 public interface IProduct { void show(); } //产品实现类 public class ProductA implements IProduct { @Override public void show() { } } //简单工厂类 public class SimpleFactory { public IProduct createProduct(ProductType type) { switch (type) { case A: return new ProductA(); } return null; } } //类型枚举 public enum ProductType { A, B, C }
缺点:
每增加一种实现,都要修改createProduct方法,增加新的分支
工厂方法模式
// 工厂方法抽象 public interface IFactory { IProduct createProduct(); } // 具体工厂实现 public class FactoryA implements IFactory { @Override public IProduct createProduct() { return new ProductA(); } }
缺点:
如果实现很多,会产生很多工厂对象
抽象工厂模式
// 另一种产品 public interface IComponent { } public class ComponentA implements IComponent { } // 抽象工厂 public interface AbstractFactory { IComponent createComponent(); IProduct createProduct(); } // 工厂实现 public class FactoryA implements AbstractFactory { public IComponent createComponent() { return new ComponentA(); } public IProduct createProduct() { return new ProductA(); } }
抽象工厂与工厂方法的区别:
一个工厂可以生产多种产品,产品属于统一族群
应用场景
1. 不需要区考虑具体的初始化过程
2. 易于产品扩展,新增实现不影响已有代码