設計模式學習之旅 之工廠模式 從賣拉麵介紹

2021-09-20 02:10:48 字數 3939 閱讀 8913

設計模式(design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、**設計經驗的總結。使用設計模式是為了可重用**、讓**更容易被他人理解、保證**可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使**編制真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣。

工廠模式主要有四類:

1、(靜態工廠模式)簡單工廠模式

3、工廠方法模式

4、抽象工廠模式

看了鴻洋大神的部落格,寫得真有趣。他從買肉夾饃開始介紹,我仿照他的寫了個賣拉麵的例子。

首先,同樣你得有個店:lamianstore

package com.example;

/** * created by leiqi on 16-5-12.

*/public class lamianstore else if (type.equals("毛細"))

else if (type.equals("寬拉麵"))

lamian.prepare();;

lamian.lamian();

lamian.zhumian();

return lamian;

}}

package com.example;

/** * created by leiqi on 16-5-12.

*/public abstract class lamian

/*** 拉麵

*/public void lamian ()

/*** 煮麵

*/public void zhumian ()

}

package com.example;

/** * created by leiqi on 16-5-12.

*/public class erxilamian extends lamian

}

package com.example;

/** * created by leiqi on 16-5-12.

*/public class kuanlamian extends lamian

}

package com.example;

/** * created by leiqi on 16-5-12.

*/public class maoxilamian extends lamian

}

現在的設計,雖說可以支援賣拉麵,但是有點問題,拉麵的種類和lamianstore藕合度太高了,如果增加幾種拉麵或是刪除幾種拉麵,那我們就得一直修改selllamian中的方法 ,所以我們需要做一定的修改,此時我們可以考慮簡單工廠模式。

我們開始寫個簡單工廠,把製作拉麵的過程拿出來:

package com.example;

/** * created by leiqi on 16-5-12.

*/public class lamianfactory else if (type.equals("毛細"))

else if (type.equals("寬拉麵"))

return lamian;

}}

然後把lamianstore修改如下:

package com.example;

/** * created by leiqi on 16-5-12.

*/public class lamianstore

/*** 根據傳入的不同型別拉不同的拉麵

*/public lamian selllamian(string type)

}

這就是簡單工廠模式,lamianstore只負責賣拉麵就好,其他法的什麼各種拉麵都與我無關,讓工廠去生產就好拉。

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

所謂的決定並不是批模式允許子類本身在執行時做決定,而是指在編寫建立者類時,不需知道建立的產品是哪乙個,選擇了使用哪個子類,就決定了實際建立的產品是什麼。

我們繼續賣拉麵,由於拉麵生意火爆,所以老闆決定在杭州,蘭州,西安開分店。既然有了分店那麼總店呢,成為抽象的啦:

package com.example;

/** * created by leiqi on 16-5-12.

*/public abstract class lamianstore

}

然後再來開三個分店,這裡只拿乙個**來做演示:

package com.example;

/** * created by leiqi on 16-5-13.

*/public class hangzhoulamianstore extends lamianstore else if (type.equals("毛細"))

else if (type.equals("寬拉麵"))

return lamian;

}}

關於杭州所有種類的拉麵就不貼拉。可以看出我們把製作拉麵的過程以抽象方法的形式讓子類取決定拉,對照定義:

1、定義拉建立物件的乙個介面: public abstract lamian createlamian(string type);

2、由子類決定例項化的類,可以看到我們的拉麵是子類生產的,也就是分店成產的。

這不是簡單工廠模式來也能實現嗎?但是沒想到這個問題:如果我要開20個分店 x 6中面/分店,那麼簡單工廠就得多120個if來判斷,很不划算啊,再說每個分店都有自己獨特的秘方和經驗,當然是自己定最好拉。

?????神馬意思呢??????

繼續拿拉麵的例項來說吧,生意火拉肯定就有人會動歪腦子,使用劣質肉和麵粉,想賺更多錢,這樣會搞砸這個牌子的。因此我們就需要建立自己的原材料**渠道,保證高質量的原材料**。

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

package com.example;

/** * created by leiqi on 16-5-13.

* 提供拉麵的原材料

*/public inte***ce lamianyclfactory

/**

* 根據蘭州當地特色,提供這兩種材料

* **/public class lzlamianylfactroy implements lamianylfactroy

@override

public yuanliao createyuanliao()

}

有拉原材料供貨渠道,我們稍微修改一下lamian的prepare方法:

package com.example;

/** * created by leiqi on 16-5-12.

*/public abstract class lamian

/*** 拉麵

*/public void lamian ()

/*** 煮麵

*/public void zhumian ()

}

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

對比定義:

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

2、用於建立相關的或依賴物件的家族/*** 生產優質牛肉*/public meat createmeat();/*** 生產麵粉,熬湯的調料等等*/public ycl createycl();,這裡所說的依賴物件的家族就是建立一系列的原材料。

設計模式學習之工廠模式

工廠模式,factorymethod,定義乙個工廠類的基類,基類中不再去實現具體的產品類的例項,而是將產品類的例項化工作放在其子類中進行,然後由客戶端來決定要使用那一種產品類的例項,工廠模式也要求產品類都具有相同的產品基類,這和簡單工廠模式比較相似。個人理解 工廠模式和簡單模式最大的區別是將產品類的...

設計模式之工廠模式學習

與簡單工廠模式相比,工廠模式為每個類增加了乙個工廠類。每個工廠類返回它所對應的類的物件指標。簡單工廠模式的最大優點 工廠類中包含了必要的邏輯判斷。根據客戶端的選擇條件動態的例項化相關的類。沒有在客戶端實現判斷,也就去除了與客戶端的依賴。簡單工廠模式實現計算類結構圖 工廠模式實現計算類結構圖 工廠模式...

設計模式學習之工廠模式

前言 設計模式不是某個api,是一系列經驗總結後的開發模板。工廠模式的分類 工廠方法模式 定義了乙個用於建立方法的介面,讓子類決定例項化哪乙個類。抽象方法模式 定義一系列相關或者相互依賴的介面,無需指定具體的類。是方法模式的擴充套件。工廠模式的意義 需要大量建立某類具有相同屬性的物件時,將例項化的任...