前言,相关联博客如下:
目录
1. 定义
1.1 什么是工厂方法模式?
定义一个创建产品对象工厂的抽象工厂接口,将创建具体产品对象(即实例化对象)工作放到子类中进行。
由四大模块组成,如下图(图片来自Android源码设计模式解析与实战)
- 抽象工厂:是工厂方法模式的核心。
- 具体工厂:实现了具体的业务逻辑。
- 抽象产品:是工厂方法模式所创建的产品的父类
- 具体产品:实现抽象产品的某个具体产品的兑现。
1.2 与简单工厂模式有什么不同?
相对比 简单工厂模式,工厂方法模式增加一个抽象的工厂接口,不需要具体产品的创建工作,而且具体产品对象工厂必须实现这个接口,让系统结构进一步抽象化。所以,其实本质上简单工厂模式只是工厂方法模式的一个弱化版本。
1.3 什么时候用工厂方法模式
当你需要创建一个复杂对象,并且在执行期间不知道需要什么确切的子类,需动态决定需要的子类时,就可以使用工厂方法模式。
2. 工厂方法模式实践案例Demo
故事前提条件参考上篇博客Android 设计模式之简单工厂模式。
老板带着小明和老王来到饭店,开始定菜。点了红烧肉和酸菜鱼。
效果见:
代码实现:
可以分为两大步骤:
一. 创建食物对象接口和具体食物对象类(跟简单工厂模式一样)。
二. 创建食物对象工厂接口和具体食物对象工厂类。
1. 创建食品对象接口
public interface Food {
String get();
}
2. 创建具体食物对象类,实现食物对象接口
public class Pork implements Food {
@Override
public String get() {
return "红烧肉";
}
}
public class Fish implements Food {
@Override
public String get() {
return "酸菜鱼";
}
}
3. 创建食物对象工厂接口
public interface FoodFactory {
Food getFood();
}
4. 创建具体食物对象工厂,实现对象工厂接口
public class PorkFactory implements FoodFactory {
@Override
public Food getFood() {
return new Pork();
}
}
public class FishFactory implements FoodFactory {
@Override
public Food getFood() {
return new Fish();
}
}
5. 测试(测试效果见上图)
public class FactoryMethodTestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_factory_method_test);
TextView firstMenuTv = findViewById(R.id.first_menu_tv);
TextView secondMenuTv = findViewById(R.id.second_menu_tv);
//通过porkFoodFactory来实例化pork对象,拿到"红烧肉"
FoodFactory porkFoodFactory = new PorkFactory();
Food pork = porkFoodFactory.getFood();
firstMenuTv.setText(pork.get());
//痛殴fishFoodFactory来实例化fish对象,拿到"酸菜鱼"
FoodFactory fishFoodFactory = new FishFactory();
Food fish = fishFoodFactory.getFood();
secondMenuTv.setText(fish.get());
}
}
3. 工厂方法模式的优缺点
优点:
1. 主要是解决了简单工厂模式的不足,当需要增加一个产品时,只要添加一个具体产品对象和具体对象工厂,符合“开放封闭原则”。
缺点:
1. 将实例化对象转移到子类中,将简单工厂模式中判断逻辑转移到子类中,增加代码量以及工作量。