工厂模式
介绍
工厂模式属于创建型模式(实例化对象模式),定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
角色
- 工厂类角色:具体产品类角色的创建者
- 抽象产品类角色:接口或抽象类,负责具体产品角色的定义,及与客户端的交互
- 具体产品角色:被工厂类创建的对象,是客户端所需要的对象
- 客户端:调用工厂类的实例,传递需要的产品信息来获取产品的对象
实例
- BitmapFactory这是我们常用的工场模式,我们需要的各种Bitmap经由BitmapFactory来创建
- CursorFactory這是产生Cursor对象工厂类,抽象产品为Cursor(接口),在CursorFactory中实例化,客户端根据所需来获取Cursor实例
- DocumentBuilderFactory是DOM 解析器工厂,它的抽象产品是DocumentBuilder(抽象类),这里又采用Builder模式
模型
如何使用工厂模式
根据工厂模式的角色,我们可以有以下四个步骤来使用工厂模式。
- 创建一个接口
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();
}
}
优缺点
- 优点:遵循开放-封闭原则,保留了封装对象创建过程的优点,降低客户端和工厂的耦合性
- 缺点:每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量