1. 程式人生 > >工廠方法模式(Factory Method Pattern)

工廠方法模式(Factory Method Pattern)

工廠方法簡介:

工廠方法(Factory Method)模式的意義是定義一個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。核心工廠類不再負責產品的建立,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。

工廠方法模式是簡單工廠模式的衍生(簡單工廠模式請見連線:https://blog.csdn.net/qq_39241239/article/details/83276111),解決了許多簡單工廠模式的問題。首先完全實現'開-閉 原則',實現了可擴充套件。其次更復雜的層次結構,可以應用於產品結果複雜的場合。

工廠方法模式對簡單工廠模式進行了抽象。有一個抽象的Factory類(可以是抽象類和介面),這個類將不再負責具體的產品生產,而是隻制定一些規範,具體的生產工作由其子類去完成。在這個模式中,工廠類和產品類往往可以依次對應。即一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品,這個具體的工廠就負責生產對應的產品。

我們現在利用工廠模式模仿女媧造人的過程:

1.首先我們有一個AbstractHuman抽象類是人類的總稱,其有三個實現類對應三個人種(白人、黃人、黑人)

2.我們還有一個抽象類AbstractHumanFactory,你可以把它看成一個八卦爐,其有三個實現類對應著三個八卦爐,分別用來產生白人、產生黃人、產生黑人。

3.我們定義的每個人都有兩個方法:getColor(獲得人的面板顏色)和talk(交談)。

我們接下來看看程式碼實現:

package DesignPattern;

abstract class AbstractHuman {
	abstract public void getColor();
	abstract public void talk();
}

class WhiteHuman extends AbstractHuman {
	public void getColor() {
		System.out.println("白色人種的面板顏色是白色的");
	}

	public void talk() {
		System.out.println("白色人種會說話,一般都是單音節");
	}
}

class YellowHuman extends AbstractHuman {
	public void getColor() {
		System.out.println("黃色人種的面板顏色是黃色的");
	}

	public void talk() {
		System.out.println("黃色人種會說話,一般都是雙音節");
	}

}

class BlackHuman extends AbstractHuman {
	public void getColor() {
		System.out.println("黑色人種的面板顏色是黑色的");
	}

	public void talk() {
		System.out.println("黑色人種會說話,但是一般人聽不懂");
	}

}

abstract class AbstractHumanFactory {
	// 八卦爐可以產生人類
	public abstract AbstractHuman createHuman();
}

class WhiteFactory extends AbstractHumanFactory {
	public AbstractHuman createHuman() {
		return new WhiteHuman();
	}
}

class YellowFactory extends AbstractHumanFactory {
	public AbstractHuman createHuman() {
		return new YellowHuman();
	}
}

class BlackFactory extends AbstractHumanFactory {
	public AbstractHuman createHuman() {
		return new BlackHuman();
	}
}

//女媧要開始造人了
public class NvWa {
	public static void main(String[] args) {
		System.out.println("--造出的第一批人是白色人種--");
		AbstractHuman whiteHuman = (new WhiteFactory()).createHuman();
		whiteHuman.getColor();
		System.out.println("--造出的第二批人是黃色人種--");
		AbstractHuman yellowHuman = (new YellowFactory()).createHuman();
		yellowHuman.getColor();
		System.out.println("--造出的第三批人是黑色人種--\"");
		AbstractHuman blackHuman = (new BlackFactory()).createHuman();
		blackHuman.getColor();
	}
}

工廠方法模式

抽象工廠角色: 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。在java中它由抽象類或者介面來實現。就是上例中的AbstractHumanFactory,也是下面類圖中的AbstractFactory。 具體工廠角色:它含有和具體業務邏輯有關的程式碼。由應用程式呼叫以建立對應的具體產品的物件。在java中它由具體的類來實現。就是上例中的WhiteFactory、YellowFactory、BlackFactory。也是下面類圖的ConcreteFactory1、ConcreteFactory2等等 抽象產品角色:它是具體產品繼承的父類或者是實現的介面。在java中一般有抽象類或者介面來實現。就是上例中的AbstractHuman,也是下面類圖的AbstractProduct。 具體產品角色:具體工廠角色所建立的物件就是此角色的例項。在java中由具體的類來實現。就是上例中的WhiteHuman、YellowHuman、BlackHuman。 來用類圖來清晰的表示下的它們之間的關係: