设计模式最佳实之工厂模式

来源:互联网 发布:java游戏编程入门 编辑:程序博客网 时间:2024/05/17 06:13

原文地址:设计模式最佳实之工厂模式

设计模式.jpg

What

工厂模式:
是创建型设计模式,用于创建对象的接口,让子类决定new那个类的实例

使用场景:

  • 在任何需要生成需要生成复杂对象的地方,都可以考虑使用工程模式
  • 复杂对象适合使用工厂模式,用new就可以完成创建的对象则无需使用工厂模式

UML图

工厂模式UML.png

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形式的硬编码判断,逻辑更加清晰简洁
  • 缺点
    • 会产生过多的产品类,导致类结构的复杂化,每新增一款产品,就需要写一个新的产品类

如果对我的文章有什么建议的,可以留言给我,我都会回复,并虚心接受,只为把最好的献给最好可爱的你们~