定义
工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。
主要作用:
将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。
解决的问题
工厂一旦需要生产新产品就需要修改工厂类的方法逻辑,违背了“开放 - 关 闭原则
使用步骤:
- 创建抽象工厂类,定义具体工厂的公共接口;
- 创建抽象产品类,定义具体产品的公共接口;
- 创建具体产品类(继承抽象产品类)定义生产的具体产品
4.创建具体的工厂类(继承抽象工厂类),定义创建对应具体产品实例方法
5.外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例
实例讲解
- 背景:小成有一间塑料加工厂(仅生产A类产品);随着客户需求的变化,客户需要生产B类产品;
- 冲突:改变原有塑料加工厂的配置和变化非常困难,假设下一次客户需要再发生变化,再次改变将增大非常大的成本;
- 解决方案:小成决定置办塑料分厂B来生产B类产品;
使用步骤
步骤1: 创建 抽象工厂类 ,定义具体工厂的公共接口
public abstract class Factory {
public abstract Product Manufacture();
}
步骤2:创建具体工厂
// 共产A类 -----生产A类产品
public class FactoryA extends Factory {
@Override
public Product Manufacture() {
return new ProductA();
}
}
//生产B类 ----生产B类产品
public class FactoryB extends Factory {
@Override
public Product Manufacture() {
return new ProductB();
}
}
步骤3:创建抽象产品
//创建抽象产品类
public abstract class Product {
public abstract void show();
}
步骤四:创建具体产品
//具体产品A类
public class ProductA extends Product {
@Override
public void show() {
Log.d("TAG", "生产出了产品A");
}
}
//具体产品B类
public class ProductB extends Product {
@Override
public void show() {
Log.d("TAG", "生产出了产品B");
}
}
5.调用
// 客户要产品A
FactoryA factoryA = new FactoryA();
factoryA.Manufacture().show();
// 客户要产品B
FactoryB factoryB = new FactoryB();
factoryB.Manufacture().show();
输出结果
2019-03-15 18:04:31.620 22089-22089/com.example.openingdemo D/TAG: 生产出了产品A
2019-03-15 18:04:31.621 22089-22089/com.example.openingdemo D/TAG: 生产出了产品B