設計模式 工廠模式

2021-07-05 08:19:14 字數 4414 閱讀 5848

工廠模式,簡單列一下這個模式的家族:

1、靜態工廠模式

2、簡單工廠模式

3、工廠方法模式

4、抽象工廠模式

是不是覺得,我勒個去,這工廠還能列出這麼多分類,哈哈,下面開始各個擊破。

1、靜態工廠模式

這個最常見了,專案中的輔助類,textutil.isempty等,類+靜態方法。下面開始詳細介紹:略。

2、簡單工廠模式

下面開始談談賣肉夾饃,最近程式設計師賣肉夾饃很火,啥時候大牛們都去賣了,我等就崛起了,哈哈。

首先你得有個店:roujiamostore

package com.zhy.pattern.factory.a;

public class roujiamostore

else if (type.equals("tian"))

else if (type.equals("la"))

roujiamo.prepare();

roujiamo.fire();

roujiamo.pack();

return roujiamo;

}

}

然後你得有各種風味的饃饃:

package com.zhy.pattern.factory.a;

public abstract class roujiamo

/** * 使用你們的專用袋-包裝

*/public void pack()

/** * 秘製裝置-烘烤2分鐘

*/public void fire()

}

package com.zhy.pattern.factory.a;

import com.zhy.pattern.factory.a.roujiamo;

/** * 辣味肉夾饃

* * @author zhy

* */

public class laroujiamo extends roujiamo

}

package com.zhy.pattern.factory.a;

/** * 酸味肉夾饃

* * @author zhy

* */

public class suanroujiamo extends roujiamo

}

package com.zhy.pattern.factory.a;

/** * 酸味肉夾饃

* * @author zhy

* */

public class suanroujiamo extends roujiamo

}

現在這樣的設計,雖然可以支援你賣肉夾饃了,但是有點問題,生產饃的種類和你的roujiamostore耦合度太高了,如果增加幾種風味,刪除幾種風味,你得一直修改sellroujiamo中的方法,所以我們需要做一定的修改,此時簡單工廠模式就能派上用場了。

我們開始寫個簡單工廠,把產生饃的過程拿出來:

package com.zhy.pattern.factory.a;

public class ******roujiamofactroy

else if (type.equals("tian"))

else if (type.equals("la"))

return roujiamo;

}

}

然後以組合的方式,讓store來使用:

package com.zhy.pattern.factory.a;

public class roujiamostore

/** * 根據傳入型別賣不同的肉夾饃

* * @param type

* @return

*/public roujiamo sellroujiamo(string type)

}

好了,現在你隨便新增什麼種類的饃,刪除什麼種類的饃就和store無關了,就是麼~人家只負責賣饃麼~ 這就是簡單工廠模式,當然了,大家也都比較熟悉。

3、工廠方法模式

定義:定義乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法模式把類例項化的過程推遲到子類。

package com.zhy.pattern.factory.b;

public abstract class roujiamostore

}

然後在開兩個分店,這裡拿乙個**做演示,其他都一樣:

package com.zhy.pattern.factory.b;

/** * 西安肉夾饃店

* * @author zhy

* */

public class xianroujiamostore extends roujiamostore

else if (type.equals("tian"))

else if (type.equals("la"))

return roujiamo;

}

}

然後就是各個西安口味的肉夾饃了,這**就不貼了。可以看出我們把製作肉夾饃的過程以抽象方法的形式讓子類去決定了,對照定義:

1、定義了建立物件的乙個介面:public abstract roujiamo createroujiamo(string type);

2、由子類決定例項化的類,可以看到我們的饃是子類生成的。

可能有人會說,我用簡單工廠模式也行啊,但是如果10來個城市*5種風味/城市,那麼豈不是簡單工廠裡面需要50多個if,再說人家西安肉夾饃分店就不能有點自己的秘訣,當然由它自己定最好。

好了,方法工廠模式介紹完畢。

4、抽象工廠模式

這定義有點繞口,算了,還是拿例子來說。繼續賣肉夾饃,咱們生意這麼好,難免有些分店開始動歪腦子,開始使用劣質肉等,砸我們的品牌。所以我們要拿錢在每個城市建立自己的原料場,保證高質量原料的**。

於是我們新建乙個提供原料的介面:

package com.zhy.pattern.factory.b;

/** * 提供肉夾饃的原料

* @author zhy

* */

public inte***ce roujiamoylfactroy

package com.zhy.pattern.factory.b;

/** * 根據西安當地特色,提供這兩種材料

* @author zhy

* */

public class xianroujiamoylfactroy implements roujiamoylfactroy

@override

public yuanliao createyuanliao()

}

有了原理工廠,那我們稍微修改下roujiamo的prepare方法:

package com.zhy.pattern.factory.b;

public abstract class roujiamo

/** * 使用你們的專用袋-包裝

*/public final void pack()

/** * 秘製裝置-烘烤2分鐘

*/public final void fire()

}

好了,現在必須用我們官方原料做為原材料了。

現在對比定義:

1、提供乙個介面:public inte***ce roujiamoylfactroy

2、用於建立相關的或依賴物件的家族 public meat createmeat();public yuanliao createyuanliao();我們介面用於建立一系列的原材料。

好了,最後測試下,我要在西安饃店,買個酸味的嚐嚐:

package com.zhy.pattern.factory.b;

public class test

}

使用官方的原料com.zhy.pattern.factory.b.freshmest@e53108 , com.zhy.pattern.factory.b.xianteseyuanliao@f62373作為原材料製作肉夾饃  

肉夾饃-專用裝置-烘烤

肉夾饃-專用袋-包裝

酸味肉夾饃

** 鴻洋大神 blog

設計模式 工廠模式 抽象工廠模式

建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...

設計模式 工廠設計模式

用於建立物件的介面,交給子類去實現 我們舉乙個生產nokia的例子 public abstract class nokiaphone先試定義了乙個抽象類,抽象出方法poweronphone 模擬手機開機的動作 public class nokia5200 extends nokiaphone pub...

設計模式 工廠設計模式

工廠模式分為工廠方法模式和抽象工廠模式 工廠方法模式分為 普通工廠模式,就是建立乙個工廠類,對實現了同一介面的一些類進行例項的建立。多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。靜態工廠...