因爲近期項目實在太忙,致使木有繼續更新,今天緩過來了。這一期主要是設計模式實戰的一些應用,因爲本身在重構項目時,看到以前的老代碼實在是慘不忍睹,因此打算優化一波,那麼設計模式是很好的選擇,會先寫工廠模式======>>>>策略模式,而後應用這幾種模式來解決項目裏面的究極老代碼======= if else ......java
工廠模式屬於建立型設計模式,須要生成的對象叫作產品,生成對象的地方叫作工廠。程序員
在任何須要生成複雜對象的場景,均可以使用工廠模式。劃重點直接用new能夠完成的不須要用工廠模式。設計模式
下面逐個介紹我所知道的各類工廠模式以及它們的特色,使用場景,並儘量的找出JDK裏它們的身影。多線程
咱們常常會去餐館吃麪,那麼咱們用工廠模式的思惟去思考,能夠理解爲:不一樣的麪條就是產品,而餐館就是一個工廠。ide
首先來一個產品的抽象類優化
package com.MyMineBug.demoRun.factory;
public abstract class INoodles {
/** * 不一樣麪條的描述 */
public abstract void desc();
}
複製代碼
再來一份蘭州拉麪(具體的實現類)spa
package com.MyMineBug.demoRun.factory;
public class LzNoodles extends INoodles{
@Override
public void desc() {
System.out.println("蘭州拉麪 深圳的好貴,想吃家裏的熱乾麪!");
}
}
複製代碼
程序猿加完班後,必備泡麪(具體的實現類)線程
package com.MyMineBug.demoRun.factory;
public class PaoNoodles extends INoodles{
@Override
public void desc() {
System.out.println("很少說,程序員加班必備,回家吃泡麪!");
}
}
複製代碼
還有最愛吃老家的熱乾麪(具體的實現類)設計
package com.MyMineBug.demoRun.factory;
public class HotNoodles extends INoodles{
@Override
public void desc() {
System.out.println("仍是家裏的熱乾麪好吃,又便宜,5快一碗!");
}
}
複製代碼
麪條原料都準備好了,接下來就要進入麪館(簡單工廠)去點餐了,麪館菜單以下:code
package com.MyMineBug.demoRun.factory;
public class SimpleNoodlesFactory {
public static final int TYPE_LZ = 1; //蘭州拉麪
public static final int TYPE_HOT = 2; //熱乾麪
public static final int TYPE_PAO = 3; //泡麪
public static INoodles createNoodies(int type) {
switch (type) {
case TYPE_LZ:
return new LzNoodles();
case TYPE_PAO:
return new PaoNoodles();
default:
return new HotNoodles();
}
}
}
複製代碼
這個簡單面館(簡單工廠)裏面,就只有三種麪條(產品),那麼你能夠想點你喜歡吃的麪條,好比我,老闆來份熱乾麪:
package com.MyMineBug.demoRun.factory;
public class TestSimpleFactory {
public static void main(String[] args) {
INoodles nodies = SimpleNoodlesFactory.createNoodies(3);
nodies.desc();
}
}
複製代碼
輸出以下:
仍是家裏的熱乾麪好吃,又便宜,5快一碗!
複製代碼
1 它是一個具體的類,非接口抽象類。有一個重要的createNoodles()方法,利用if或者 switch建立產品並返回。
2 createNoodles()方法一般是靜態的,因此也稱之爲靜態工廠。
1 擴展性差(我想增長一種麪條,除了新增一個麪條產品類,還須要修改工廠類方法)。
2 不一樣的產品須要不一樣額外參數的時候 不支持。
這裏貼一下代碼,其實原理跟上面同樣,跟new Object()性質是同樣的;主要是用Class.forName(clz.getName()).newInstance() 代碼以下:
package com.MyMineBug.demoRun.factory;
public class ReflectNoodiesFactory {
public static <T extends INoodles> T createNoodles(Class<T> clz) {
T result = null;
try {
result = (T) Class.forName(clz.getName()).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}
複製代碼
多方法的工廠模式爲不一樣產品,提供不一樣的生產方法,使用時須要哪一種產品就調用該種產品的方法,使用方便、容錯率高。 工廠代碼以下:
package com.MyMineBug.demoRun.factory;
public class ManyWayNoodlesFactory {
/** * 模仿Executors 類 * 生產泡麪 * * @return */
public static INoodles createPm() {
return new PaoNoodles();
}
/** * 模仿Executors 類 * 生產蘭州拉麪 * * @return */
public static INoodles createLz() {
return new LzNoodles();
}
/** * 模仿Executors 類 * 生產熱乾麪 * * @return */
public static INoodles createHOT() {
return new HotNoodles();
}
}
複製代碼
輸出以下:
==============================模仿Executor類==============================
這種我比較青睞,增長一個新麪條,只要去增長一個static方法便可,也不修改原方法邏輯
蘭州拉麪 深圳的好貴,想吃家裏的熱乾麪!
仍是家裏的熱乾麪好吃,又便宜,5快一碗!
複製代碼
我的的話,比較推薦使用這種方法做爲工廠。
普通工廠就是把簡單工廠中具體的工廠類,劃分紅兩層:抽象工廠層+具體的工廠子類層。
麪條工廠(抽象工廠類),做用就是生產麪條:
package com.MyMineBug.demoRun.factory;
public abstract class NoodlesFactory {
public abstract INoodles create();
}
複製代碼
蘭州拉麪工廠 (具體工廠子類):
package com.MyMineBug.demoRun.factory;
public class LzNoodlesFactory extends NoodlesFactory{
@Override
public INoodles create() {
return new LzNoodles();
}
}
複製代碼
後面倆個具體實現工廠相似,就不貼代碼了,接下來看使用時的代碼:
package com.MyMineBug.demoRun.factory;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
public class TestSimpleFactory {
public static void main(String[] args) {
// INoodles nodies = SimpleNoodlesFactory.createNoodies(2);
// nodies.desc();
/** * 多方法靜態工廠(模仿Executor類) */
// System.out.println("==============================模仿Executor類==============================" +
// "\n 這種我比較青睞,增長一個新麪條,只要去增長一個static方法便可,也不修改原方法邏輯");
// INoodles lz2 = ManyWayNoodlesFactory.createLz();
// lz2.desc();
// String ssString = null;
// INoodles gk2 = ManyWayNoodlesFactory.createHOT();
// gk2.desc();
/** * 普通工廠方法: */
System.out.println("===========================普通工廠方法==============================" +
"\n 這種要多寫一個類,不過更面向對象吧 = = ,實際中我更傾向於使用【模仿Executor類】的方式");
NoodlesFactory factory1 = new LzNoodlesFactory();
INoodles gk3 = factory1.create();
gk3.desc();
}
}
複製代碼
輸出:
===========================普通工廠方法==============================
這種要多寫一個類,不過更面向對象吧 = = ,實際中我更傾向於使用【模仿Executor類】的方式
蘭州拉麪 深圳的好貴,想吃家裏的熱乾麪!
複製代碼
能夠看出,普通工廠模式特色:不只僅作出來的產品要抽象, 工廠也應該須要抽象。
工廠方法使一個產品類的實例化延遲到其具體工廠子類.
工廠方法的好處就是更擁抱變化。當需求變化,只須要增刪相應的類,不須要修改已有的類。
而簡單工廠須要修改工廠類的create()方法,多方法靜態工廠模式須要增長一個靜態方法。
我的推薦使用多方法靜態工廠
抽象工廠其實能夠理解爲,多產品的多抽象工廠,好比:舉個例子來講,每一個店(工廠)不只僅賣麪條,還提供飲料賣,那麼就會維護多個工廠,須要把工廠抽象出來,並且每次拓展新產品種類,例如不只賣吃賣喝,我還想賣睡,提供牀位服務,這須要修改抽象工廠類,所以全部的具體工廠子類,都被牽連,須要同步被修改。 這裏具體實現,我就不貼代碼,讀者自行百度,由於此次優化代碼也沒用到這個。
一句話總結工廠模式:方便建立 同種產品類型的 複雜參數 對象。具體使用能夠根據實際業務場景進行選擇使用,工廠模式的理解到此爲止,寫一篇會講一下策略模式。
若是以爲還不錯,請點個贊!!!
Share Technology And Love Life