設計模式:工廠方法模式
來源:程序員人生 發布時間:2015-01-16 08:18:37 閱讀次數:3606次
原文地址:http://leihuang.org/2014/12/03/factory-method/
Creational 模式
物件的產生需要消耗系統資源,所以如何有效力的產生、管理 與操作物件,1直都是值得討論的課題, Creational 模式即與物件的建立相干,在這個分類下的模式給出了1些指點原則及設計的方向。下面羅列到的全屬于Creational 模式
- Simple Factory 模式
- Abstract Factory 模式
- Builder 模式
- Factory Method 模式
- Prototype 模式
- Singleton 模式
- Registry of Singleton 模式
基本概念
當1個類沒法預感要創建哪一種類的對象或是1個類需要由子類來指定創建的對象時我們就需要用到Factory Method 模式了.簡單說來,Factory Method可以根據不同的條件產生不同的實例,固然這些不同的實例通常是屬于相同的類型,具有共同的父類.Factory Method把創建這些實例的具體進程封裝起來了,簡化了客戶真個利用,也改良了程序的擴大性,使得將來可以做最小的改動就能夠加入新的待創建的類. 通常我們將Factory Method作為1種標準的創建對象的方法,當發現需要更多的靈活性的時候,就開始斟酌向其它創建型模式轉化
factory method 模式結構

- Product: 需要創建的產品的抽象類.
- ConcreteProduct: Product的子類,1系列具體的產品.
- Creator: 抽象創建器接口,聲明返回Product類型對象的Factory Method.
- ConcreteCreator: 具體的創建器,重寫Creator中的Factory Method,返回ConcreteProduct類型的實例.
代碼實現
看了這么多,還不如直接寫代碼,來得好.
為了于簡單工廠和抽象工廠做辨別,我們也取福克斯電影公司的例子.
首先定義1個Movie抽象類,然后繼承兩個具體電影的子類,動作片(ActionMovie),愛情片(LoveMovie). 然后有1個抽象的工廠(FoxFilmFactory),它有兩個子類,1個生產工夫片(ActionFoxFactory),1個生產愛情片(LoveFoxFactory).然后我們觀眾(AudienceClient),只管問抽象工廠提供影片,不需要去管它具體怎樣分類的.
下面是類結構圖.

Movie 抽象類 --電影統稱
package org.leihuang.factorymethod;
public abstract class Movie {
public abstract void play() ;
}
ActionMovie 抽象類的子類 --動作片
package org.leihuang.factorymethod;
public class ActionMovie extends Movie {
@Override
public void play() {
System.out.println("哼哼哈兮!");
}
}
LoveMovie 繼承Movie --愛情片
package org.leihuang.factorymethod;
public class LoveMovie extends Movie {
@Override
public void play() {
System.out.println("愛老虎油!");
}
}
FoxFilmFactory 抽象類 --福克斯總公司
package org.leihuang.factorymethod;
public abstract class FoxFilmFactory {
public abstract Movie createMovie(String name) ;
}
ActionFoxFactory 繼承FoxFilmFactory類 --生產動作片的部門
package org.leihuang.factorymethod;
public class ActionFoxFactory extends FoxFilmFactory {
@Override
public Movie createMovie(String name) {
Movie movie = null ;
try {
movie = (Movie)Class.forName(name).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return movie ;
}
}
LoveFoxFactory 繼承抽象類 --生產愛情片的部門
package org.leihuang.factorymethod;
public class LoveFoxFactory extends FoxFilmFactory {
@Override
public Movie createMovie(String name) {
Movie movie = null ;
try {
movie = (Movie)Class.forName(name).newInstance() ;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return movie;
}
}
AudienceClient --觀眾
package org.leihuang.factorymethod;
public class AudienceClient {
public static void main(String[] args) {
FoxFilmFactory foxAction = new ActionFoxFactory() ;
foxAction.createMovie("org.leihuang.factorymethod.ActionMovie").play(); ;
FoxFilmFactory foxLove = new LoveFoxFactory() ;
foxLove.createMovie("org.leihuang.factorymethod.LoveMovie").play();
}
}
2014⑴2-03 23:55:17
Brave,Happy,Thanksgiving !
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈