原文地址:设计模式最佳实之工厂模式
What
工厂模式:
是创建型设计模式,用于创建对象的接口,让子类决定new那个类的实例
使用场景:
- 在任何需要生成需要生成复杂对象的地方,都可以考虑使用工程模式
- 复杂对象适合使用工厂模式,用new就可以完成创建的对象则无需使用工厂模式
UML图
How
代码例子
首先定义工厂抽象类
Factory
public abstract class Factory{ /** * 抽象工厂方法 * 具体生产什么产品由子类决定 * return product */ public abstract Product createProduct(Class<T> clz); }
定义工厂实现类,根据传入工厂实现类型生产相应的产品
- 使用反射的方法,减少冗余的工厂实现类
FactoryImp
public class FactoryImp extends Factory{ /** * 具体的工厂 * 根据传入的产品类型返回相应的产品 * return product */ public <T extends Product> createProduct(Class<T> clz){ Product p = null; try{ p = (Product)class.forName(clz.getName()).newInstance(); }catch(Execption e){ } return p; }; }
定义产品抽象类
Product
public abstract class Product{ public abstract void method(); }
定义产品A
ProductA
public class ProductA extends Product{ public void method(){ System.out.println("I am a product A!!"); } }
定义产品B
ProductB
public class ProductB extends Product{ public void method(){ System.out.println("I am a product B!!"); } }
测试例子:
public static void main(String[] args) { Factory factory = new FactoryImp(); // 生产ProductA Product pA = factory.createProduct(ProductA.class); pA.method(); // 生产ProductB Product pB = factory.createProduct(ProductB.class); pB.method(); }
结果:
I am a product A!! I am a product B!!
总结
- 优点
- 从上面的例子可以看出,工厂模式是一个很好设计模式,能够很好解耦工厂与产品之间关系,通过接口/抽象类指定规范,只需替换相应的实现即可完成替换,很好符合了设计模式原则的开闭原则,对拓展开放,对修改关闭
- 减少
if...elase
形式的硬编码判断,逻辑更加清晰简洁
- 缺点
- 会产生过多的产品类,导致类结构的复杂化,每新增一款产品,就需要写一个新的产品类