摘要:簡單工廠模式創建單一的對象示例描述工廠模式主要是為了創建對象實例或者類簇抽象工廠關心的是最終產出創建的對象而不關心創建的過程在出現多個類的時候每次創建需要找到對應的類往往比較麻煩這時候通常使用一個函數進行封裝來創建所需要的對象這樣就無需關注
簡單工廠模式(創建單一的對象) 示例1 描述
工廠模式主要是為了創建對象實例或者類簇(抽象工廠), 關心的是最終產出(創建)的對象, 而不關心創建的過程.
在出現多個類的時候, 每次創建需要找到對應的類往往比較麻煩, 這時候通常使用一個函數進行封裝來創建所需要的對象,
這樣就無需關注創建這些對象到底依賴哪些基類了, 只要知道有這個函數就可以了, 通常這個函數被稱為工廠函數,
這種模式叫簡單工廠模式
假設一體育商品店賣器材, 里面有很多體育商品, 及其相關介紹. 當你來到體育用品店買一個籃球及相關介紹時,
你只需要問售貨員, 她會幫你找到你所需要的東西.
</>復制代碼
// 籃球基類
var Basketball = function() {
this.intro = "籃球盛行于美國";
}
Basketball.prototype = function() {
getMember: function() {
console.log("每個隊伍需要5名隊員");
},
getBallSize: function() {
console.log("籃球很大");
}
}
// 足球基類
var Football = function() {
this.intro = "足球在世界范圍內盛行";
}
Football.prototype = function() {
getMember: function() {
console.log("每個隊伍需要11名隊員");
},
getBallSize: function() {
console.log("足球很大");
}
}
// 網球基類
var Tennis = function() {
this.intro = "每年有很多網球系列賽";
}
Tennis.prototype = function() {
getMember: function() {
console.log("每個隊伍需要1名隊員");
},
getBallSize: function() {
console.log("網球很小");
}
}
// 運動工廠(這邊相當于咨詢體育器材店的售貨員, 告訴她你想要買什么體育用品)
var SportFactory = function(name) {
switch(name) {
case "basketball":
return new Basketball();
case "football":
return new Football();
case "tennis":
return new Tennis();
}
}
var ball = new SportFactory("tennis");
console.log(ball.intro) // 每年有很多網球系列賽
console.log(ball.getMember()); // 每個隊伍需要1名隊員
示例2
描述
簡單工廠模式的理念就是創建對象, 而除此之外, 簡單工廠模式還可以創建相似對象. 在創建多個類的時候, 假設每個類都有很多相似的地方, 比如在多種彈出框上都有關閉按鈕, 都有提示文案等. 可以通過將這些相似的東西提取, 不相似針對性處理即可.
案例</>復制代碼
假設當前項目需求是需要做各種彈出框: 警示框, 確認框及提示框.
實現
</>復制代碼
var LoginAlert = function(text) {
this.content = text;
};
LoginAlert.prototype.show = function() {
// 顯示警示框
};
var LoginConfirm = function(text) {
this.content = text;
};
LoginConfirm.prototype.show = function() {
// 顯示確認框
};
var LoginPrompt = function(text) {
this.content = text;
};
LoginPrompt.prototype.show = function() {
// 顯示提示框
};
function createPop(type, text) {
var o = new Object();
o.content = text;
o.show = function() {
// 顯示方法
};
if(type === "alert") {
// 警示框差異部分
}
if(type === "confirm") {
// 確認框差異部分
}
if(type === "prompt") {
// 提示框差異部分
}
return o;
}
// 創建警示框
var userNameAlert = createPop("alert", "用戶名只能是26個字母和數字");
工廠方法模式(創建多類對象)
示例
描述
案例</>復制代碼
通過對產品類的抽象使其創建業務主要負責用于創建多類產品的實例.
實現</>復制代碼
假設有一批關于計算機培訓的廣告資源需要投放, 一批是PHP要求黃色字體紅色背景, 一批JAVA綠色字體,
一批JAVASCRIPT粉色背景....
</>復制代碼
var Java = function(content) {
this.content = content;
(functiont(content) {
var div = document.createElement("div");
div.innerHTML = content;
div.style.color = "green";
document.getElementById("container").appendChild(div);
})(content);
};
var Php = function(content) {
this.content = content;
(functiont(content) {
var div = document.createElement("div");
div.innerHTML = content;
div.style.color = "yellow";
div.style.background = "red";
document.getElementById("container").appendChild(div);
})(content);
};
var Javascript = function(content) {
this.content = content;
(functiont(content) {
var div = document.createElement("div");
div.innerHTML = content;
div.style.background = "pink";
document.getElementById("container").appendChild(div);
})(content);
};
// 創建學科類工廠
function JobFactory(type, content) {
switch(type) {
case "java":
return new Java(content);
case "php":
return new Php(content);
case "Javascript":
return new Javascript(contet);
}
}
// 又要添需求啦.....多加一批UI學科, 紅色邊框.....
// 代碼改進:
var Factory = function(type, content) {
if(this instanceof Factory) {
var s = new this[type] (content);
return s;
} else {
return new Factory(type, content);
}
};
// 在工廠原型中設置創建所有類型數據對象的基類
Factory.prototype = {
Java: function() {
// ...
},
Php: function() {
// ...
},
Javascript: function() {
// ...
},
UI: function() {
// ...
}
};
var data = [
{type:"JavaScript", content:"javascript"},
{type:"Java", content:"java"},
{type:"PHP", content:"php"},
{type:"UI", content:"ui"}
];
for(var i = data.length; i >= 0; i--) {
Factory(data[i].type, data[i].content);
}
抽象工廠模式(創建類簇)
示例
描述
抽象工廠模式一般不用來創建具體對象, 抽象類中定義的方法只是顯性地定義一些功能, 但沒有具體的實現, 而一個對象需要具有一套完整的功能, 所以用抽象類創建的對象也是抽象的而非真實對象. 因此一般用它作為父類來創建子類.
抽象工廠其實是一個實現子類繼承父類的方法, 在這個方法中需要通過傳遞子類以及要繼承父類(抽象類)的名稱,并且在抽象工廠方法中又增加了一次對抽象存在性的一次判斷, 如果存在, 則將子類繼承父類的方法. 然后子類通過寄生式繼承.繼承父類的原型中需要注意一點是, 在對過渡類的原型繼承時, 不是繼承父類的原型, 而是通過new關鍵字復制父類的一個實例, 這么做事因為過渡類不應僅僅繼承父類的原型方法, 還要繼承父類的對象屬性, 所以要通過new關鍵字將父類的構造函數執行一遍來復制構造函數中的屬性和方法
抽象工廠添加抽象類比較特殊, 因為抽象工廠是個方法不需要實例化對象, 故只需要一份, 因此直接為抽象工廠添加類的屬性即可.
實現</>復制代碼
// 抽象工廠方法
var VehicleFatory = function(subType, superType) {
// 判斷抽象工廠中是否有該抽象類
if(typeof VehicleFactory[superType] === "function") {
// 緩存類
function F() {};
// 繼承父類屬性和方法
F.prototype = new VehicleFactory[superType] ();
// 將子類constructor 指向子類
subType.constructor = subType;
// 子類原型繼承"父類"
subType.prototype = new F();
} else {
// 不存在該抽象類拋出錯誤
throw new Error("未創建該抽象類");
}
};
// 小汽車抽象類
VehicleFactory.Car = function() {
this.type = "car";
};
VehicleFactory.Car.prototype = {
getPrice: function() { return new Error("抽象方法不能調用"); },
getSpeed: function() { return new Error("抽象方法不能調用"); }
};
// 公交車抽象類
VehicleFactory.Bus = function() {
this.type = "bus";
};
VehicleFactory.Bus.prototype = {
getPrice: function() { return new Error("抽象方法不能調用"); },
getSpeed: function() { return new Error("抽象方法不能調用"); }
};
// 貨車抽象類
VehicleFactory.Truck = function() {
this.type = "truck";
};
VehicleFactory.Truck.prototype = {
getPrice: function() { return new Error("抽象方法不能調用"); },
getSpeed: function() { return new Error("抽象方法不能調用"); }
};
// 創建產品子類繼承相應的產品簇抽象類
// 寶馬汽車子類
var BMW = function(price, speed) {
this.price = price;
this.speed = speed;
}
//抽象工廠實現對Car抽象類的繼承
VehicleFactory(BMW, "Car");
BMW.prototype.getPrice = function() { return this.price };
BMW.prototype.getSpeed = function() { return this.speed };
// 公交車...
// 貨車...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/80135.html
摘要:基于工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。工廠方法模式之所以又被稱為多態工廠模式,是因為所有的具體工廠類都具有同一抽象父類。工廠方法模式總結工廠方法模式是簡單工廠模式的進一步抽象和推廣。 JavaScript工廠模式 首先需要說一下工廠模式。工廠模式根據抽象程度的不同分為三種 簡單工廠模式 工廠方法模式 抽象工廠模式 1.簡單工廠模式 簡單工廠模式:又稱為靜態工廠方法...
摘要:二簡單工廠模式組成工廠類工廠模式的核心,通過調用它來實現其他類的功能。三工廠方法模式利用工廠方法模式可以有效解決簡單工廠模式破壞開閉原則的問題。 一、概念 1、工廠模式分為三類:(1)簡單工廠模式:一個工廠創建所有產品(2)工廠方法模式:一個工廠方法創建一個產品(3)抽象工廠模式:一個工廠方法創建一類產品 2、創建型模式這種模式是指將實例的創建和使用分離開來,隱藏類實例的創建細節,外界...
摘要:簡單工廠,工廠模式和抽象工廠。不要認為簡單工廠是用就覺得一無是處,也不要覺得抽象工廠比較高大上就到處套。 工廠模式,實際上也會根據業務情景不同會有不同的實現方式。一般分為3種。簡單工廠,工廠模式和抽象工廠。顧名思義,這三種從簡單到抽象,名稱越來越高大上,實現方式肯定是越來越復雜 結論1:三種工廠的實現越來越復雜 簡單工廠 public class Factory { // 定義...
摘要:我認為按書上的順序比較好理解因為簡單靜態工廠模式是在工廠方法模式上縮減,抽象工廠模式是在工廠方法模式上再增強。所以我就先講工廠方法模式了。抽象工廠模式抽象工廠模式就比較復雜了,我們一般的應用都寫不到。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 昨天寫了單例模式了,今天是時候寫工廠模式啦~ 工廠模式我個人認為其實比...
閱讀 1868·2021-09-22 15:45
閱讀 1654·2019-08-30 15:55
閱讀 1838·2019-08-29 11:16
閱讀 3313·2019-08-26 11:44
閱讀 714·2019-08-23 17:58
閱讀 2703·2019-08-23 12:25
閱讀 1637·2019-08-22 17:15
閱讀 3615·2019-08-22 16:09
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要