1. 程式人生 > >工廠模式(2)簡單工廠模式下篇

工廠模式(2)簡單工廠模式下篇

    前言:今天我們一起來學習一種簡單而且又有逼格的技術,設計模式中的工廠模式。雖然工作的時候我們使用的框架都是封裝好的,直


接參考API寫程式碼就Ok了,但是總有一些公司美其名曰要考察面試者的基本功,於是就會問問設計模式或者演算法,框架原始碼。其實沒有那


個公司想著讓自己的公司員工成為大牛,原因也很簡單你的技術牛了肯定想要更高的工資,公司不想支付高工資又會導致員工跳槽。


在這裡插入圖片描述


    問題描述:公司開發一個寵物管理系統,專案經理讓小張寫一個波斯貓的類,後面業務需求發生更改,在建立物件的時候需要初始化

name屬性,於是所有呼叫波斯貓建立類的程式碼都需要發生修改,於是小張把物件的建立交給了波斯貓的工廠,完美的解決了這個問題,


但是新的問題又來了,專案經理告訴小張新增一個埃及貓類,小張開始寫程式碼.


public class TestNoFactory {
	public static void main(String[] args) {
		PersianCat persianCat = new PersianCat();
		EgyptCat egyptCat = new EgyptCat();
	}
}

class EgyptCat {
	public void run() {
		System.out.println("EgyptCat.run()");
	}
}

class PersianCat {
	public void run() {
		System.out.println("PersianCat.run()");
	}
}

    在程式碼省略掉工廠情況下,小張的程式碼面臨著兩個問題


      1、需要對貓類進行抽象出一個父類或者父介面,因為別的同事寫的程式碼所有涉及到波斯貓作為引數傳遞的時候都需要用埃及貓重

載,如果兩種貓還好,如果數量大到一定程度,工作量也大到無法想象,這個時候需要傳入這些類的父類


       2、別的同事建立貓物件只需要建立父類物件,那麼使用者呼叫建立方法並傳入貓的種類,通過工廠模式自動返回建立好的物件即可.


小張意識到這個問題之後於是將程式碼修改如下


public class TestEasyFactory {
	public static void main(String[] args) {
		//向工廠模式傳參並建立物件
		Cat cat = CatFactory.create(CatType.PersianCat);
	}
}

class CatFactory {
	public static Cat create(CatType type) {
		Cat cat = null;
		//判斷貓的型別建立物件
		if (CatType.PersianCat == type) {
			cat = new PersianCat();
		} else if (CatType.Egypt == type) {
			cat = new EgyptCat();
		}
		return cat;
	}
}

interface Cat {

}

class EgyptCat implements Cat {
	public void run() {
		System.out.println("EgyptCat.run()");
	}
}

class PersianCat implements Cat {
	public void run() {
		System.out.println("PersianCat.run()");
	}
}

enum CatType {
	PersianCat, Egypt
}

    通過對上述程式碼的觀察,我們大概可以發現兩件事情


1、提前對同一類事物進行抽象,將來即使新增別的子類也可以繼續使用


2、工廠建立的物件的返回值為同一型別的父類,根據傳入的型別判斷建立具體子類物件,這也是OOP的體現,而且還可以在父類或者父


介面中定義讓子類必須實現的抽象方法,以上兩點就是簡單工廠模式的核心思想。


在這裡插入圖片描述

    作為一個好的魔術師你永遠不知道他會從箱子裡拿出什麼變成什麼,可怕的是客戶是最好的魔術師,於是客戶說增加需求了,


我們需要將貓的種類再新增五種,那麼你感覺這會給小張的開發帶來什麼難點呢?


請繼續關注我哦


下集預告:《工廠模式(3)方法工廠模式》




熱門推薦工廠模式(1)簡單工廠模式上篇 https://mp.csdn.net/postedit/84940741
                   關於IT行業加班的問題            https://mp.csdn.net/postedit/84565639
                   執行緒不安全?                          https://mp.csdn.net/postedit/84856356