工厂模式(FactoryModel)

1. 定义

定义一个用于创建件对象的接口,让子类决定实例化那个类。工厂方法是一个类的实例化延迟到子类。

2. 使用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂的对象适合使用工厂模式,用new就可创建的对象无需使用工厂模式。

3. 工厂模式代码

  1. 抽象产品类:
/**抽象产品类*/
public abstract class Product {  
    //抽象方法  
    public abstract void method1();  
    //抽象方法       
    public abstract void method2();  
}
  1. 具体产品类ProductA:
/**具体产品类*/
public abstract class ProductA extend Product {  

    //具体事项方法
    @Override
    public void method1() {
        //业务逻辑处理
    }
    //具体事项方法
    @Override
    public void method2() {
        //业务逻辑处理
    }
}
  1. 抽象工厂类:
    /**负责自定义产品对象的产生
    创建一个产品对象,其输入参数可以是任意对象,
    一般为String Enum Class 等,当然也可以为空
    */
    public abstract class AbstractProductFactory {
       public abstract  <T extends Product> T createProduct(Class<T> c);
    }
  1. 具体工厂类:

public class ProductFactory extend AbstractProductFactory {
    @Override
    public <T extend Product> T createProduct(Class<T> c){
        Product product = null;
        try {
            product = (Product) Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return product;
    }
}

5.应用代码:

AbstractProductFactory productFactory = new ProductFactory;
Product product = productFactory.createProduct(ProductA.class);
prodcut.method1();
product.method2();

4. 优缺点:

  • 代码结构清晰,封装性好,只需要知道具体产品类的名字就可以创建该类;
  • 扩张性优秀,在增加具体产品类的时候,不需要工厂类做任何的改变,就可以完成系统扩展;
  • 工厂类与产品类完全解耦,产品类做任何的变化,都与工厂类无关;

5. 扩展

  • 简单工厂模式

实现原理:去掉抽象工厂类AbstractProductFactory类,将具体工厂类的createProduct()方法设置为静态方法(添加static 关键字)

  • 升级为多个工厂类

对每一个子类构建一个对应的ProductFactory工厂类,例如:ProductAFactory、ProductBFactory,去除通用的ProductFactory工厂类,每个子类的工厂类++只++生产对应的子类。

  • 替代单例模式
  • 延迟初始化

6.参考文献

  • 《Android 源码设计模式》
  • 《设计模式之禅》
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容