语言与模式-03抽象工厂模式
意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
- 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
Java实现
表现在代码层面就是一个工厂可以返回多个不同的实例!
比如:Pig不仅分颜色,还分国家,比如荷兰Pig,新西兰Pig。
public class RedPigFactory implements PigFactory{
public Pig getNetherlandsPig(){
return new RedNetherlandsPig();
}
public Pig getNewZealandPig(){
return new RedNewZealandPig();
}
}
Clojure实现
而在Clojure中就是选择函数的条件多了!
(defmulti run (fn [t] t))
(defmethod run
[:RedPig :Netherlands]
[t]
(println "Netherlands RedPig run"))
(defmethod run
[:GreenPig :Netherlands]
[t]
(println "Netherlands GreenPig run"))
(defmethod run
[:BluePig :Netherlands]
[t]
(println "Netherlands BluePig run"))
(defmethod run
[:RedPig :NewZealand]
[t]
(println "NewZealand RedPig run"))
(defmethod run
[:GreenPig :NewZealand]
[t]
(println "NewZealand GreenPig run"))
(defmethod run
[:BluePig :NewZealand]
[t]
(println "NewZealand BluePig run"))
(run [:BluePig :Netherlands])