那些年你未曾注意過的設計模式
1.工廠模式(簡單靜態工廠)
public abstract class Drink {
public void make() {
// 1. 拿出一次性飲料杯
System.out.println("拿出一次性飲料杯");
// 2. 加入速溶橙汁粉
System.out.println("加入" + getInstantPackage());
// 3. 加水衝兌
System.out.println("加水");
// 4. 加蓋, 打包
System.out.println("加蓋, 打包");
}
abstract String getInstantPackage();
}
public class Coke extends Drink {
@Override
String getInstantPackage() {
return "速溶可樂粉";
}
}
public class PlumJuice extends Drink {
@Override
String getInstantPackage() {
return "速溶酸梅粉";
}
}
public class OrangeJuice extends Drink {
@Override
String getInstantPackage() {
return "速溶橙汁粉";
}
}
public class Factory{
public static Drink create(String drinkType) {
// Java7開始, switch支持String
switch (drinkType) {
case "橙汁":
return new OrangeJuice();
case "酸梅湯":
return new PlumJuice();
case "可樂":
return new Coke();
default:
return new OrangeJuice();
}
}
}
同時在分支邏輯上 屬於策略模式,在生產目的上屬於工廠模式(關注的是產出,策略關注的分支)
個人理解:調用對象不需要關心對象是如何產生的,只需要調用工廠生產方法,並且傳入(或者工廠內部自行判斷條件) ,產出對應的對象產品
弊端: 判斷的分支UML邏輯和生成對象的創建操作都在工廠類中進行,工廠類複雜.
2.裝飾者模式
public interface Drink {
String make();
}
public class Coke implements Drink {
@Override
public String make() {
return "這是一杯可樂";
}
}
blic class Ice implements Drink {
private Drink originalDrink;
public Ice(Drink originalDrink) {
this.originalDrink = originalDrink;
}
@Override
public String make() {
return originalDrink.make() + ", 加一塊冰";
}
public class XiaoGuang {
public static void main(String[] args) {
Drink coke = new Coke();
System.out.println(coke.make());
Drink iceCoke = new Ice(new Coke());
System.out.println(iceCoke.make());
}
}
public abstract class Stuff implements Drink {
private Drink originalDrink;
public Stuff(Drink originalDrink) {
this.originalDrink = originalDrink;
}
@Override
public String make() {
return originalDrink.make() + ", 加一份" + stuffName();
}
abstract String stuffName();
}
public class Ice extends Stuff {
public Ice(Drink originalDrink) {
super(originalDrink);
}
@Override
String stuffName() {
return "冰";
}
}
Drink iceSugarXDrink = new Ice(new Sugar(new XDrink()));
System.out.println(iceSugarXDrink.make());
這是一杯X牌飲料, 加一份糖, 加一份冰
裝飾者模式就是用來動態的給對象加上額外的職責.
Drink是被裝飾的對象, Stuff作爲裝飾類, 可以動態地給被裝飾對象添加特徵, 職責.
注意:
Builder模式是一種創建型的設計模式. 旨在解決對象的差異化構建的問題.
裝飾者模式是一種結構型的設計模式. 旨在處理對象和類的組合關係.
構建者模式的情況通常是可以預見的,但是裝飾者可以通過增加類 而不是修改原本的構建類這種方式,所以構建者模式通常用於一些參數不可預見的情況