语言与模式-02工厂模式
意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
适用性
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望由它的子类来指定它所创建的对象的时候。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
Java实现
public interface Pig{
public void run();
}
public interface PigFactory{
public Pig getPig();
}
public class RedPig{
public void run(){
System.out.println("RedPig run");
}
}
public class RedPigFactory implements PigFactory{
public Pig getPig(){
return new RedPig();
}
}
public class GreenPig{
public void run(){
System.out.println("GreenPig run");
}
}
public class GreenPigFactory implements PigFactory{
public Pig getPig(){
return new GreenPig();
}
}
public class BluePig{
public void run(){
System.out.println("BluePig run");
}
}
public class BluePigFactory implements PigFactory{
public Pig getPig(){
return new BluePig();
}
}
调用:
PigFactory factory = new BluePigFactory();
factory.getPig().run();
Clojure
这里的核心是什么?根据不同的需要返回了不同的对象,然后呢?执行返回对象的方法!
在Clojure里就是根据不同的需要直接执行不同的函数!Clojure有默认支持!MultiMethod!
(defmulti run (fn [t] t))
(defmethod run
:RedPig
[t]
(println "RedPig run"))
(defmethod run
:GreenPig
[t]
(println "GreenPig run"))
(defmethod run
:BluePig
[t]
(println "BluePig run"))
(run :RedPig)