工廠的作用就是生產例項,但其與建構函式不同。工廠是用來生產多種型別例項的。例如,麥當勞可以生產漢堡,薯條和可樂,再例如,美的可以生產冰箱,洗衣機,和空調等。工廠生產的產品必須要用相關性,屬於一個產品族或者屬於多個相近的產品族。
工廠模式分為三種,分別是
1. 簡單工廠,通過switch語句根據產品標識生產不同型別的產品,直接呼叫各種產品的建構函式
2. 工廠,對簡單工廠的優化,將工廠進行抽象,新增產品只需增加指定工廠和產品,不需要修改單一工廠的switch語句,不會影響其他產品
3. 抽象工廠,比工廠模式多的就是,可以生產多個產品族,就是一個工廠可以同時生產多個產品,而普通工廠只能生產一個產品
(ES6)程式碼實現如下:
1.簡單工廠
class SimpleFactory{ constructor(prodNo) //構造工廠時告知工廠產品標識 { this.prodNo = prodNo; } GetProduct() { switch (this.prodNo) //根據產品標識生產產品 { default: return new ProductA(); case 1: return new ProductA(); case 2: return new ProductB(); } } } //產品介面 class IProduct { //產品方法 //...... } //產品A class ProductA extends IProduct { //產品屬性 //...... } //產品B class ProductB extends IProduct { //產品屬性 //...... }
2.工廠模式
class IFactory //工廠介面 { GetProduct(){ } } //A工廠類 class FactoryA extends IFactory { constructor() { this.productA = new ProductA(); } //A工廠生產A產品 GetProduct() { return this.productA; } } //B工廠類 class FactoryB extends IFactory { constructor() { this.productB = new ProductB(); } //B工廠生產B產品 GetProduct() { return this.productB; } } //產品介面 class IProduct { //產品方法 //...... } //產品A class ProductA extends IProduct { //產品屬性 //...... } //產品B class ProductB extends IProduct { //產品屬性 //...... }
3.抽象工廠
//工廠介面,即抽象工廠 class IFactory { CreateFridge(); CreateAirCondition(); } //三星的工廠,生產三星的產品族 class SamsungFactory extends IFactory { CreateAirCondition() { return new SamsungAirCondition(); //三星的工廠生產三星的空調 } CreateFridge() { return new SamsungFridge(); //三星的工廠生產三星的冰箱 } } //格力的工廠,生產格力的產品族 class GreeFactry extends IFactory { CreateAirCondition() { return new GreeAirCondition(); //格力的工廠生產格力的空調 } CreateFridge() { return new GreeFridge(); //格力的工廠生產格力的冰箱 } } //冰箱產品介面 class IFridge { //冰箱產品介面 //冰箱的action } //空調介面 class IAirCondition { //空調產品介面 //空調的action } //三星的冰箱 class SamsungFridge extends IFridge { //三星冰箱的action和property } //格力的冰箱 class GreeFridge extends IFridge { //格力冰箱的action和property } //三星的空調 class SamsungAirCondition extends IAirCondition { //三星空調的action和property } //格力的空調 class GreeAirCondition extends IAirCondition { //格力空調的action和property }
參考:http://blog.jobbole.com/109594/