工厂模式

工厂模式

介绍

工厂模式属于创建型模式(实例化对象模式),定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

角色

  • 工厂类角色:具体产品类角色的创建者
  • 抽象产品类角色:接口或抽象类,负责具体产品角色的定义,及与客户端的交互
  • 具体产品角色:被工厂类创建的对象,是客户端所需要的对象
  • 客户端:调用工厂类的实例,传递需要的产品信息来获取产品的对象

实例

  • BitmapFactory这是我们常用的工场模式,我们需要的各种Bitmap经由BitmapFactory来创建
  • CursorFactory這是产生Cursor对象工厂类,抽象产品为Cursor(接口),在CursorFactory中实例化,客户端根据所需来获取Cursor实例
  • DocumentBuilderFactory是DOM 解析器工厂,它的抽象产品是DocumentBuilder(抽象类),这里又采用Builder模式

模型

设计模式-工厂模式.JPG

如何使用工厂模式

根据工厂模式的角色,我们可以有以下四个步骤来使用工厂模式。

  • 创建一个接口
public interface Product{
    void function();
}
  • 创建实现接口的实体类

public class ProductA implements Product{

    @Override
    public void function(){
        
    }
}

public class ProductB implements Product{

    @Override
    public void function(){
        
    }
}

public class ProductB implements Product{

    @Override
    public void function(){
        
    }
}

  • 创建一个工厂,生成实体类的对象
public class Factory {

    //使用 getProduct 方法获取形状类型的对象
    public Product getProduct(String type){
        if(type == null){
            return null;
        }
        if(type.equalsIgnoreCase("ProductA")){
            return new ProductA();
        } else if(type.equalsIgnoreCase("ProductB")){
            return new ProductB();
        } else if(type.equalsIgnoreCase("ProductC")){
            return new ProductC();
        }
        return null;
    }
}
  • 客户端使用该工厂的实例,通过传递信息来获取实体类的对象
public class Client{

    public void getProductInstance(){
        Factory factory = new Factory();
        Product productA = factory.getProduct("ProductA");
        productA.function();

        Product productB = factory.getProduct("ProductB");
        productB.function();
    }
}

优缺点

  • 优点:遵循开放-封闭原则,保留了封装对象创建过程的优点,降低客户端和工厂的耦合性
  • 缺点:每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容