您好,登錄后才能下訂單哦!
一、簡單(靜態(tài))工廠模式
1.首先建立一個產品的抽象類
需要生產什么產品就需要建立一個相應產品的抽象
public abstract class INoodles {
/**
* 描述每種面條啥樣的
*/
public abstract void desc();
}
2.再建立幾種具體的產品類:
例如:蘭州拉面,泡面,干吃面
public class LzNoodles extends INoodles {
@Override
public void desc() {
System.out.println("蘭州拉面");
}
}
public class PaoNoodles extends INoodles {
@Override
public void desc() {
System.out.println("泡面");
}
}
public class GankouNoodles extends INoodles {
@Override
public void desc() {
System.out.println("干吃面");
}
}
3.在建立完這些產品后就可以建立(造面的)工廠了:
工廠里面包含了我們可以生產的產品(面)
public class SimpleNoodlesFactory {
public static final int TYPE_LZ = 1;//蘭州拉面
public static final int TYPE_PM = 2;//泡面
public static final int TYPE_GK = 3;//干吃面
public static INoodles createNoodles(int type) {
switch (type) {
case TYPE_LZ:
return new LzNoodles();
case TYPE_PM:
return new PaoNoodles();
case TYPE_GK:
default:
return new GankouNoodles();
}
}
}
4.開始根據(jù)客人的要求生產產品
如下代碼是生產干吃面的過程。
INoodles noodles = SimpleNoodlesFactory.createNoodles(SimpleNoodlesFactory.TYPE_GK);
noodles.desc();
該設計模式只可以生產工廠能生產的產品,如需要增加產品,需要在工廠類中增加相應的靜態(tài)變量。
特點
1 它是一個具體的類,非接口 抽象類。有一個重要的create()方法,利用if或者 switch創(chuàng)建產品并返回。
2 create()方法通常是靜態(tài)的,所以也稱之為靜態(tài)工廠。
缺點
1 擴展性差(我想增加一種面條,除了新增一個面條產品類,還需要修改工廠類方法)
2 不同的產品需要不同額外參數(shù)的時候 不支持。
二、另一種簡單工廠(反射):
利用反射Class.forName(clz.getName()).newInstance()實現(xiàn)的簡單工廠:
public class StaticNoodlesFactory {
/**
* 傳入Class實例化面條產品類
*
* @param clz
* @param
* @return
*/
public static T createNoodles(Class clz) {
T result = null;
try {
result = (T) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
特點
1 它也是一個具體的類,非接口 抽象類。但它的create()方法,是利用反射機制生成對象返回,好處是增加一種產品時,不需要修改create()的代碼。但這種寫法很少見
三、多方法工廠(常用)
多方法的工廠模式為不同產品,提供不同的生產方法,使用時 需要哪種產品就調用該種產品的方法,使用方便、容錯率高。
工廠如下:
public class MulWayNoodlesFactory {
/**
* 模仿Executors 類
* 生產泡面
*
* @return
*/
public static INoodles createPm() {
return new PaoNoodles();
}
/**
* 模仿Executors 類
* 生產蘭州拉面
*
* @return
*/
public static INoodles createLz() {
return new LzNoodles();
}
/**
* 模仿Executors 類
* 生產干扣面
*
* @return
*/
public static INoodles createGk() {
return new GankouNoodles();
}
}
這種我比較青睞,增加一個新面條,只要去增加一個static方法即可,也不修改原方法邏輯
四 普通工廠
普通工廠就是把簡單工廠中具體的工廠類,劃分成兩層:抽象工廠層+具體的工廠子類層。(一般->特殊)
面條工廠(抽象工廠類),作用就是生產面條:
public abstract class NoodlesFactory {
public abstract INoodles create();
}
蘭州拉面工廠(具體工廠子類)
public class LzFactory extends NoodlesFactory {
@Override
public INoodles create() {
return new LzNoodles();
}
}
泡面工廠 (具體工廠子類):
public class PaoFactory extends NoodlesFactory {
@Override
public INoodles create() {
return new PaoNoodles();
}
}
干吃面工廠 (具體工廠子類):
public class GankouFactory extends NoodlesFactory {
@Override
public INoodles create() {
return new GankouNoodles();
}
}
使用時:
/**
* 普通工廠方法:
*/ 鄭州好的婦科醫(yī)院 http://www.zzkedayy.com/
System.out.println("===========================普通工廠方法==============================" +
"\n 這種要多寫一個類,不過更面向對象");
NoodlesFactory factory1 = new GankouFactory();
INoodles gk3 = factory1.create();
gk3.desc();
普通工廠與簡單工廠模式的區(qū)別:
可以看出,普通工廠模式特點:不僅僅做出來的產品要抽象, 工廠也應該需要抽象。
工廠方法使一個產品類的實例化延遲到其具體工廠子類.
工廠方法的好處就是更擁抱變化。當需求變化,只需要增刪相應的類,不需要修改已有的類。
而簡單工廠需要修改工廠類的create()方法,多方法靜態(tài)工廠模式需要增加一個靜態(tài)方法。
六 抽象工廠
以上介紹的工廠都是單產品系的。抽象工廠是多產品系 (貌似也有產品家族的說法)。
舉個例子來說,每個店(工廠)不僅僅賣面條,還提供飲料賣。
提供飲料賣,飲料是產品,先抽象一個產品類,飲料:
public abstract class IDrinks {
/**
* 描述每種飲料的價格
*/
public abstract void prices();
}
然后實現(xiàn)兩個具體產品類:
可樂:
public class ColaDrinks extends IDrinks {
@Override
public void prices() {
System.out.println("可樂三塊五");
}
}
白開水
public class WaterDrinks extends IDrinks {
@Override
public void prices() {
System.out.println("和我一樣的窮鬼都喝水,不要錢~!");
}
}
抽象飯店,無外乎吃喝(抽象工廠類):
public abstract class AbstractFoodFactory {
/**
* 生產面條
*
* @return
*/
public abstract INoodles createNoodles();
/**
* 生產飲料
*/
public abstract IDrinks createDrinks();
}
蘭州大酒店(具體工廠類):
public class LzlmFoodFactory extends AbstractFoodFactory {
@Override
public INoodles createNoodles() {
return new LzNoodles();//賣蘭州拉面
}
@Override
public IDrinks createDrinks() {
return new WaterDrinks();//賣水
}
}
KFC(具體工廠類):
public class KFCFoodFactory extends AbstractFoodFactory {
@Override
public INoodles createNoodles() {
return new PaoNoodles();//KFC居然賣泡面
}
@Override
public IDrinks createDrinks() {
return new ColaDrinks();//賣可樂
}
}
使用:
/**
* 抽象工廠方法:
*/
System.out.println("==============================抽象方法==============================" )
AbstractFoodFactory abstractFoodFactory1 = new KFCFoodFactory();
abstractFoodFactory1.createDrinks().prices();
abstractFoodFactory1.createNoodles().desc();
abstractFoodFactory1= new LzlmFoodFactory();
abstractFoodFactory1.createDrinks().prices();
abstractFoodFactory1.createNoodles().desc();
輸出:
==============================抽象方法==============================
可樂三塊五
泡面
和我一樣的窮鬼都喝水,不要錢~!
蘭州拉面
一句話總結工廠模式:方便創(chuàng)建 同種產品類型的 復雜參數(shù) 對象
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。