在工廠方法模式中,父類負責定義建立對象的公共接口,而子類則負責生成具體的對象,這樣作的目的是將類的實例化操做延遲到子類中完成,即由子類來決定究竟應該實例化(建立)哪個類。ide
工廠方法模式的UML類圖spa
Product:產品角色對象
定義產品的接口。接口
ConcreteProduct:真實的產品ci
實現接口Product類。產品
Creator:工廠角色ast
聲明工廠方法(FactoryMethod),返回一個產品。class
ConcreteCreator:真實的工廠擴展
實現FactoryMethod工廠方法,由客戶調用,返回一個產品的實例。程序
Java實例——擴展了的手機工廠
手機接口:
public interface Mobile {
public void call();
}
手機工廠接口:
public interface MobileFactory {
public Mobile produceMobile();
}
摩托羅拉手機實現手機接口:
public class Motorola implements Mobile{
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println("摩托羅拉手機");
}
}
諾基亞手機實現手機接口:
public class Nokia implements Mobile{
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println("諾基亞手機");
}
}
摩托羅拉工廠實現了生產手機的方法,返回摩托羅拉手機:
public class MotorolaFactory implements MobileFactory{
@Override
public Mobile produceMobile() {
// TODO Auto-generated method stub
System.out.print("摩托羅拉工廠製造了");
return new Motorola();
}
}
諾基亞工廠實現了生產手機的方法,返回諾基亞手機:
public class NokiaFactory implements MobileFactory{
@Override
public Mobile produceMobile() {
// TODO Auto-generated method stub
System.out.print("諾基亞工廠製造了");
return new Nokia();
}
}
客戶程序:
public class Client {
public static void main(String args[]){
MobileFactory mf;
Mobile m;
mf=new MotorolaFactory();
m=mf.produceMobile();
m.call();
mf=new NokiaFactory();
m=mf.produceMobile();
m.call();
}
}
輸出結果:
摩托羅拉工廠製造了摩托羅拉手機
諾基亞工廠製造了諾基亞手機
應用情景:
1. 類不知道本身要建立哪個對象。
2. 類用它的子類來指定建立哪一個對象。
3. 客戶須要清楚建立了哪個對象。