一篇搞懂工廠模式的實戰應用

1、前言

  因爲近期項目實在太忙,致使木有繼續更新,今天緩過來了。這一期主要是設計模式實戰的一些應用,因爲本身在重構項目時,看到以前的老代碼實在是慘不忍睹,因此打算優化一波,那麼設計模式是很好的選擇,會先寫工廠模式======>>>>策略模式,而後應用這幾種模式來解決項目裏面的究極老代碼======= if else ......java

2、概述

  工廠模式屬於建立型設計模式,須要生成的對象叫作產品,生成對象的地方叫作工廠程序員

2.1 使用場景

  在任何須要生成複雜對象的場景,均可以使用工廠模式。劃重點直接用new能夠完成的不須要用工廠模式設計模式

下面逐個介紹我所知道的各類工廠模式以及它們的特色,使用場景,並儘量的找出JDK裏它們的身影。多線程

3、簡單(靜態)工廠

3.1 舉栗子

  咱們常常會去餐館吃麪,那麼咱們用工廠模式的思惟去思考,能夠理解爲:不一樣的麪條就是產品,而餐館就是一個工廠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快一碗!
複製代碼

3.2 特色

1 它是一個具體的類,非接口抽象類。有一個重要的createNoodles()方法,利用if或者 switch建立產品並返回。

2 createNoodles()方法一般是靜態的,因此也稱之爲靜態工廠

3.3 缺點

1 擴展性差(我想增長一種麪條,除了新增一個麪條產品類,還須要修改工廠類方法)。

2 不一樣的產品須要不一樣額外參數的時候 不支持。

3.4 工廠類實現的另一種方式----(反射)

這裏貼一下代碼,其實原理跟上面同樣,跟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;
	}

}

複製代碼

3、多方法工廠

  多方法的工廠模式爲不一樣產品,提供不一樣的生產方法,使用時須要哪一種產品就調用該種產品的方法,使用方便、容錯率高。 工廠代碼以下:

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快一碗!
複製代碼

3.1 JDK 相關源碼實現多方法工廠模式

你們在使用多線程時應該會常用這些方法吧,若是看過源碼也瞭解設計模式之工廠模式,那麼對這些類應該很熟悉的。

我的的話,比較推薦使用這種方法做爲工廠。

3、普通工廠

  普通工廠就是把簡單工廠中具體的工廠類,劃分紅兩層:抽象工廠層+具體的工廠子類層

3.1 舉栗子

麪條工廠(抽象工廠類),做用就是生產麪條:

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類】的方式
蘭州拉麪 深圳的好貴,想吃家裏的熱乾麪!
複製代碼

3.2 優缺點

能夠看出,普通工廠模式特色:不只僅作出來的產品要抽象, 工廠也應該須要抽象。

工廠方法使一個產品類的實例化延遲到其具體工廠子類.

工廠方法的好處就是更擁抱變化。當需求變化,只須要增刪相應的類,不須要修改已有的類。

而簡單工廠須要修改工廠類的create()方法,多方法靜態工廠模式須要增長一個靜態方法。

我的推薦使用多方法靜態工廠

4、抽象工廠

  抽象工廠其實能夠理解爲,多產品的多抽象工廠,好比:舉個例子來講,每一個店(工廠)不只僅賣麪條,還提供飲料賣,那麼就會維護多個工廠,須要把工廠抽象出來,並且每次拓展新產品種類,例如不只賣吃賣喝,我還想賣睡,提供牀位服務,這須要修改抽象工廠類,所以全部的具體工廠子類,都被牽連,須要同步被修改。 這裏具體實現,我就不貼代碼,讀者自行百度,由於此次優化代碼也沒用到這個。

5、總結

  一句話總結工廠模式:方便建立 同種產品類型的 複雜參數 對象。具體使用能夠根據實際業務場景進行選擇使用,工廠模式的理解到此爲止,寫一篇會講一下策略模式。

  若是以爲還不錯,請點個贊!!!

  Share Technology And Love Life

相關文章
相關標籤/搜索