工廠模式
簡單工廠模式
簡單工廠模式(Simple Factory Pattern),又稱爲靜態工廠方法(static Factory Method),它屬於創建型模式。
在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
比如有一個電腦商,目前生產聯想電腦,隨着業務擴展,他現在需要生產惠普的電腦,我們就需要一個單獨的類來專門生產電腦,這就用到了簡單工廠模式。
下面以代碼爲例:
接口:
package designpattern.factory.simplefactory.noodles;
public interface INoodles {
/**
* 描述每種麪條啥樣的
*/
public abstract void desc();
}
package designpattern.factory.simplefactory.noodles;
public class LzNoodles implements INoodles {
@Override
public void desc() {
System.out.println("蘭州拉麪,蘭州特色小喫");
}
}
package designpattern.factory.simplefactory.noodles;
public class PaoNoodles implements INoodles {
@Override
public void desc() {
System.out.println("泡麪,程序員必備");
}
}
package designpattern.factory.simplefactory.noodles;
public class ReganNoodles implements INoodles {
@Override
public void desc() {
System.out.println("紅油熱乾麪,武漢特色小喫");
}
}
簡單工廠模式
package designpattern.factory.simplefactory;
import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.LzNoodles;
import designpattern.factory.simplefactory.noodles.PaoNoodles;
import designpattern.factory.simplefactory.noodles.ReganNoodles;
/**
* 簡單工廠模式
* 一家“簡單面館”(簡單工廠類)
*/
public class SimpleNoodlesFactory {
public static final int TYPE_LZ = 1;//蘭州拉麪
public static final int TYPE_PM = 2;//泡麪
public static final int TYPE_GK = 3;//熱乾麪
/**
* 如果生產對象的方法是static的,這種簡單工廠也叫做靜態工廠
* 如果生產對象的方法不是static的,這種簡單工廠也叫做實例工廠
* @param type
* @return
*/
public static INoodles createNoodles(int type) {
switch (type) {
case 1:
return new LzNoodles();
case 2:
return new PaoNoodles();
case 3:
return new ReganNoodles();
default:
return new LzNoodles();
}
}
}
測試
package designpattern.factory.simplefactory;
import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.LzNoodles;
public class Test {
public static void main(String[] args) {
/**
* 一開始,窮,想吃麪必須得自己做
* 想喫拉麪得自己做,new LzNoodles()
* 想喫泡麪得自己做,new PaoNoodles()
* 想喫熱乾麪得自己做,new ReganNoodles()
*/
// 做拉麪喫
INoodles lzNoodles = new LzNoodles();
// 做泡麪喫
// INoodles paoNoodles = new PaoNoodles();
// 做熱乾麪喫
// INoodles reganNoodles = new ReganNoodles();
// 然而,new來new去,改來改去,好心煩......
/**
* 忽然,有一天走了狗屎運成了暴發戶
* 幸福生活從此來臨,吃麪從此變得簡單
* 給麪館說一聲想喫啥,麪館做好了給自己就好了
* 自己不必關心麪條怎麼做(怎麼new,如何new)讓麪館操心去吧(麪館幫我們new)!
* 好省心,有錢就是好,太爽了!
*/
INoodles iNoodles = SimpleNoodlesFactory.createNoodles(2); // 和具體的對象脫離關係
iNoodles.desc();
/**考慮使用工廠模式
* 1) 當客戶程序不需要知道要使用對象的創建過程。
* 2) 客戶程序使用的對象存在變動的可能,或者根本就不知道使用哪一個具體的對象。
*/
}
}
工廠方法模式
工廠方法模式是比較複雜一點的工廠模式的體現,主要是通過創建工廠類來進行對對象的構建。
package designpattern.factory.factorymethod;
import designpattern.factory.simplefactory.noodles.INoodles;
/**
* 工廠方法模式
*/
public interface INoodlesFactory {
INoodles createNoodles();
}
package designpattern.factory.factorymethod;
import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.LzNoodles;
public class LzINoodlesFactory implements INoodlesFactory {
@Override
public INoodles createNoodles() {
return new LzNoodles();
}
}
package designpattern.factory.factorymethod;
import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.PaoNoodles;
public class PaoINoodlesFactory implements INoodlesFactory {
@Override
public INoodles createNoodles() {
return new PaoNoodles();
}
}
package designpattern.factory.factorymethod;
import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.ReganNoodles;
public class ReganINoodlesFactory implements INoodlesFactory {
@Override
public INoodles createNoodles() {
return new ReganNoodles();
}
}
測試類
package designpattern.factory.factorymethod;
import designpattern.factory.simplefactory.noodles.INoodles;
public class Test {
public static void main(String[] args) {
INoodlesFactory noodlesFactory = new LzINoodlesFactory();
INoodles noodles = noodlesFactory.createNoodles();
noodles.desc();
}
}
代碼實例:
設計模式demo