溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JAVA設計模式之 工廠模式

發(fā)布時間:2020-08-03 14:12:13 來源:網(wǎng)絡 閱讀:88 作者:nineteens 欄目:編程語言

  一、簡單(靜態(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ù) 對象


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI