<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>工廠設計模式</title>
<!--
@theme: javascript高級 工廠模式設計
@autor:EthanCoco
@date:2015-11-21
@email:lijianlin0204@163.com
-->
<script type=text/javascript charset=utf-8>
//創建一個命名空間
var LJL = {};
/**
*建一個接口
*接口需要兩個參數
*參數1: 接口的名字(string)
*參數2: 方法名稱(數組(string))
*/
LJL.Interface = function(name,methods){
if(arguments.length !== 2){//判斷接口參數個數是否正確
throw new Error("參數個數不正確!");
}
this.name = name;
this.methods = [];//定義一個內置的空數組接受方法名稱里的元素
for(var i = 0;i < methods.length;i++){
if(typeof methods[i] !== 'string'){
throw new Error("方法名稱錯誤,必須是字符串類型!");
}
//把傳入參數的元素全部放到內置的methods中去
this.methods.push(methods[i]);
}
};
/**
*接口靜態方法
*參數:object
*檢驗接口里的方法是否實現
*如果通過不做任何操作,如果不通過,拋出error
*目的:檢測方法是否全部實現
*object 要求參數必須有兩個以上
*一個是對象實例
*其它是要檢驗的接口對象
*/
LJL.Interface.checkMethodsIsPass = function(object){
if(arguments.length < 2){//判斷參數,如果參數小于2,拋出異常
throw new Error("要求參數必須有兩個以上@param1=實例對象,其它參數是接口對象!");
}
//獲得接口實例對象
for(var i = 1;i<arguments.length;i++){//i=1是因為第二個參數是需要檢測的接口
var instanceInterface = arguments[i];
//判斷參數是否是接口對象
if(instanceInterface.constructor !== LJL.Interface){
throw new Error("參數是不是接口對象!");
}
//如果是,檢測接口對象里的方法是否實現
for(var j = 0;j<instanceInterface.methods.length;j++){
//用歷史變量接受一個方法的名稱,名稱是字符串,如果不是就拋出error
var methodName = instanceInterface.methods[j];
//object[key]表示的就是方法
//方法是一個函數,需要判斷
if(!object[methodName] || typeof object[methodName] !== 'function'){
throw new Error("這個方法 '" + methodName + "' 找不到!");
}
}
}
};
/**
* 繼承方法
* @param {Object} sub
* @param {Object} sup
*/
LJL.extend=function(sub ,sup){
// 目的: 實現只繼承父類的原型對象
var F = new Function(); // 1 創建一個空函數 目的:空函數進行中轉
F.prototype = sup.prototype; // 2 實現空函數的原型對象和超類的原型對象轉換
sub.prototype = new F(); // 3 原型繼承
sub.prototype.constructor = sub ; // 4還原子類的構造器
//保存一下父類的原型對象: 一方面方便解耦 另一方面方便獲得父類的原型對象
sub.superClass = sup.prototype; //自定義一個子類的靜態屬性 接受父類的原型對象
//判斷父類的原型對象的構造器 (加保險)
if(sup.prototype.constructor == Object.prototype.constructor){
sup.prototype.constructor = sup ; //手動歡迎父類原型對象的構造器
}
};
////////////////////////////////////////////////
//以上都是為工廠設計模式做必要的準備
////////////////////////////////////////////////
//思路整理
/**
*設計一個買電腦的工廠設計模式
*首先,得有一個“工廠”;
*其次,工廠用來“生產電腦”;
*然后,電腦需要“賣出去”;
*繼續,賣出去需要一個“專賣店”
*最后,買電腦的人到什么樣的商店去“買什么樣的電腦”
*/
//生產電腦的工廠 目的:生產電腦
var PCFactory = {
//里面有生產電腦的方法
createPC : function(type){//type 動態生產電腦類型,即客戶需要的電腦生產
//利用eval動態創建傳入類型的實例對象
var pc = eval('new '+type+'()');
//電腦在生產的時候就需要檢測是否合格!
//第一個參數是電腦的實例對象
//第二個參數是接口的實例對象
LJL.Interface.checkMethodsIsPass(pc,PCInterface);
return pc;
}
};
//創建接口實例對象
//接口需要有兩個參數
//一個是接口的實例對象,一個是方法(數組),open(開機),run(運行)
var PCInterface = new LJL.Interface('PCInterface',['open','run']);
//創建一個電腦的基類
function BasePC(){}
//在原型對象上實現方法
BasePC.prototype = {
constructor : BasePC,//還原構造器
open : function(){
alert(this.constructor.name + "...open");
},
run : function(){
alert(this.constructor.name + "...run");
}
};
//電腦有不同的品牌,不同的專賣店提供不同的電腦
//創建一個抽象的基類專賣店
function PCShop(){}
PCShop.prototype = {
constructor : PCShop ,
//買電腦的方法
sellPC:function(type){
this.abstractSellPC(type);
} ,
abstractSellPC: function(){
throw new Error('this method is abstract...');
}
};
//創建不同品牌的專門店
///////////////////////////////////////////////////
//戴爾專賣店
function DellPCShop(){}
//每個店都有賣電腦的方法,所以我們繼承PCShop里的方法
LJL.extend(DellPCShop,PCShop);
//電腦專賣店有不同型號的dell電腦
DellPCShop.prototype = {
constructor : DellPCShop,
sellPC : function(type){
var pc ;
var pctypes = ['dellx1','dellx5','dellx8'];//所有dell電腦的型號
for(i in pctypes){
//判斷商店是否有你要的型號
if(pctypes[i] === type){
pc = PCFactory.createPC(type);
break;
}else{
throw new Error("沒有你要的型號!");
}
}
return pc;
}
};
//dell電腦不同型號的方法檢測實現
//檢測不同品牌的電腦
function dellx1(){}
LJL.extend(dellx1,BasePC); //繼承基類的方法
function dellx5(){}
LJL.extend(dellx5,BasePC);
function dellx8(){}
LJL.extend(dellx8,BasePC);
//////////////////////////////////////////////
var shop = new DellPCShop();
var pc = shop.sellPC('dellx1');
pc.open();
</script>
</head>
<body>
</body>
</html>
工廠模式設計
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
推薦閱讀更多精彩內容
- 面向對象思想設計原則 在實際的開發中,我們要想更深入的了解面向對象思想,就必須熟悉前人總結過的面向對象的思想的設計...
- 哲學上說“是什么,為什么,怎么用”是認識問題的邏輯思維過程. 本文將以廠長工廠造車為例子講述這三種設計模式。 簡單...