以下以例子来总结几种工厂模式,如有需要,请花点时间耐心阅读,谢谢。
- 模板设计模式:
coffee的冲泡法:
1.将水煮沸 (boilWater())
2.用沸水冲泡coffee (brew())
3.将coffee倒进杯子(pourInCup())
4.加糖和牛奶(addCondiments())
Tea的冲泡法:
1.将水煮沸(boilWater())
2.用沸水浸泡Tea(brew())
3.把Tea倒进杯子(pourInCup())
4.加柠檬(addCondiments())
因为coffee和Tea都可以概括为Drink,所以定义一个抽象类Drink,而在制作coffee和Tea的方法中,可以看出第一步和第三步是相同的,只有第二步和第四步不相同,所以将第二、四步定义为抽象方法,第一、三步为普通方法。直接上代码:
//创建抽象类饮料
abstract class Drink {
//制作方法
void prepareRecipe() {
boilWater();
brew();
pourInCup();
if(isAddCondiments()) {
addCondiments();
}
}
//第二、四步定义为抽象方法
public abstract void brew();
public abstract void addCondiments();
//第一、三步为普通方法
public final void boilWater() {
System.out.println("Boiling water");
}
public final void pourInCup() {
System.out.println("Pouring into a cup");
}
//钩子方法 hook 默认为实现 子类可选择性覆写
public boolean isAddCondiments() {
return true;
}
//创建coffee类继承Drink类
class Coffee extends Drink {
//重写第二、四步及钩子方法
public void brew() {
System.out.println("Dripping coffee throught filter");
}
public void addCondiments() {
System.out.println("Adding sugar and milk");
}
public boolean isAddCondiments() {
System.out.println("你需要加入调料吗?加 or 不加");
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
if (str.equals("加")) {
return true;
}
return false;
}
}
//创建Tea类继承Drink类
class Tea extends Drink {
//重写第二、四步及钩子方法
public void brew() {
System.out.println("Steeping the tea");
}
public void addCondiments() {
System.out.println("Adding Lemon");
}
public boolean isAddCondiments() {
System.out.println("你需要加入调料吗?加 or 不加");
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
if (str.equals("加")) {
return true;
}
return false;
}
public class Test {
public static void main(String[] args) {
//向上转型,通过子类实现父类的实例化对象
Drink coffee = new Coffee();
coffee.prepareRecipe();
Drink tea = new Tea();
tea.prepareRecipe();
}
}