JS中的工厂模式
.一个栗子:
var BicycleShop = function(){};
BicycleShop.prototype = {
sellBicycle : function( model ){
var bicycle;
switch(model){
case "The Speedster":
bicycle = new Speedster();
break;
case "The Lowrider":
bicycle = new Lowrider();
break;
case "The Cruiser":
default:
bicycle = new Cruiser();
break;
}
return bicycle;
}
}
.简单工厂模式:
// 以上方式很管用,但是一旦说我需要添加一些自行车款式的时候我就必须修改 BicycleShop里的 switch部分,那么只要是修改就有可能带来BUG。所以,将这部分生成实例的代码单独的提出来分工交给一个简单的工厂对象是一个很不错的方法。
// BicycleFactory对象里有一个createBicycle参数,这个参数为(bycicle)
var BicycleFactory = {
createBicycle : function( model ){
var bicycle;
switch( model ){
case "The Speedster":
bicycle = new Speedster();
break;
case "The Lowrider":
bicycle = new Lowrider();
break;
case "The Cruiser":
default:
bicycle = new Cruiser();
break;
}
return bycicle;
}
}
// BicycleFactory是一个脱离于BicycleShop的单体。降低耦合度的效果显而易见。当需要添加新的类型的时候,不需要动 BicycleShop 只需修改工厂单体对象就可以。
// 在BicycleShop中调用BicycleFactory.createBicycle()方法
var BicycleShop = function(){};
BicycleShop.prototype = {
sellBicycle : function( model ){
var bicycle = BicycleFactory.createBicycle( model );
return bicycle;
}
}
// 以上就是一个很好的 简单工厂模式 的实例。该模式将成员对象的创建工作交给一个外部对象实现,该外部对象可以是一个简单的命名空间,也可以是一个类的实例。
.工厂模式:
//commonInterface相当于一个接口,让所有对象都能通过同一个方法名.commonInterface(),而访问到自己新建对象的函数
var MyApi = function(){};
MyApi.prototype={
commonInterface: function( model ){
var bicycle = this.createBicycle( model ); //注意这里的this.createBicycle( model )
return bicycle;
}
}
var A_Class = function(){};
A_Class.prototype={
commonInterface: function( model ){
var bicycle = this.createBicycle( model ); //注意这里的this.createBicycle( model )
return bicycle;
}
}
//extend( A_Class , commonInterface ); // extend(A,B)即将B的所有方法拷贝到A上去
A_Class.prototype.createBicycle = function( model ){
var bicycle;
switch( model ){
case "The Speedster":
bicycle = new Speedster_A();
break;
case "The Lowrider":
bicycle = new Lowrider_A();
break;
case "The Cruiser":
default:
bicycle = new Cruiser_A();
break;
}
return bicycle;
}
function Speedster_A(){console.log()}
function Lowrider_A (){console.log()}
function Cruiser_A (){console.log()}
var B_Class = function(){};
B_Class.prototype={
commonInterface: function( model ){
var bicycle = this.createBicycle( model ); //注意这里的this.createBicycle( model )
return bicycle;
}
}
//extend( generalClass , basicClass );
B_Class.prototype.createBicycle = function( model ){
var bicycle;
switch( model ){
case "The Speedster":
bicycle = new Speedster_B();
break;
case "The Lowrider":
bicycle = new Lowrider_B();
break;
case "The Cruiser":
default:
bicycle = new Cruiser_B();
break;
}
return bicycle;
}
function Speedster_B(){console.log("AAAAAAAA")}
function Lowrider_B (){console.log("BBBBBBBB")}
function Cruiser_B (){console.log("CCCCCCCC")}
var temp = new A_Class();
var test = temp.commonInterface("The Cruiser"); //
var temp = new B_Class();
var test = temp.commonInterface("The Cruiser");// CCCCCCCC
// 工厂模式的优点:
. 动态实现
例如自行车的例子,创建一些用不同方式实现统一接口的对象,那么可以使用一个工厂方法或者简单工厂对象来简化实现过程。选择可以是明确进行的也可以是隐含的。
. 节省设置开销
如果对象要进行复杂的并且彼此相关的设置的时候,那么工厂模式可以很显著的减少每种对象的代码量。将特定的设置代码提取出来会使得代码有极大地提升。并且能优化结构便于维护。
. 用于许多小型对象组成一个大对象。
. 工厂模式之利
主要好处就是可以消除对象间的耦合,通过使用工程方法而不是new关键字。将所有实例化的代码集中在一个位子防止代码重复。
. 工厂模式之弊
大多数类最好使用new关键字和构造函数,可以让代码更加简单易读。而不必去查看工厂方法来知道。
JS中的工厂模式的更多相关文章
- JS设计模式--简单工厂模式
在JS中创建对象会习惯的使用new关键字和类构造函数(也是可以用对象字面量). 工厂模式就是一种有助于消除两个类依赖性的模式. 工厂模式分为简单工厂模式和复杂工厂模式,这篇主要讲简单工厂模式. 简单工 ...
- JS设计模式之工厂模式
1 什么是工厂模式? 工厂模式是用来创建对象的一种最常用的设计模式.我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂.工厂模式根据抽象程度的不同可以分为: ...
- JS面向对象之工厂模式
js面向对象 什么是对象 "无序属性的集合,其属性可以包括基本值.对象或者函数",对象是一组没有特定顺序的的值.对象的没个属性或方法都有一个俄名字,每个名字都映射到一个值. 简单来 ...
- js设计模式:工厂模式、构造函数模式、原型模式、混合模式
一.js面向对象程序 var o1 = new Object(); o1.name = "宾宾"; o1.sex = "男"; o1.a ...
- PHP中“简单工厂模式”实例讲解
原创文章,转载请注明出处:http://www.cnblogs.com/hongfei/archive/2012/07/07/2580776.html 简单工厂模式:①抽象基类:类中定义抽象一些方法, ...
- Spring中的工厂模式和单例模式
Spring预备知识(适合中小型项目) 作用:集成和管理其他框架 工厂模式: A a = new A( ); 将类所要创建的对象写入工厂,统一进行管理 package com.spring; pu ...
- js 中使用工厂方法和构造器方法
1 直接创建对象 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...
- [JS设计模式]:工厂模式(3)
简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...
- JS设计模式——7.工厂模式(概念)
工厂模式 本章讨论两种工厂模式: 简单工厂模式 使用一个类(通常是一个单体)来生成实例. 使用场景:假设你想开几个自行车商店(创建自行车实例,组装它,清洗它,出售它),每个店都有几种型号的自行车出售. ...
随机推荐
- 电赛初探(一)——正弦波、方波、锯齿波转换
一.题目要求: 1.使用555做出脉冲方波 2.使用TL084运放做出方波和锯齿波 3.使用TLM314稳压做直流偏置 4.方波要求峰峰值为1V,正弦波要求峰值为0~2V,锯齿波要求峰峰值为1V. 二 ...
- Python实现的粒子群优化算法
01.from numpy import array 02.from random import random 03.from math import sin, sqrt 04. 05.iter_ma ...
- Source insight怎样恢复默认界面布局 窗口嵌入
先关闭,然后在c盘的文档的Source Insight\Settings目录里面,将CF3文件剪切到别的地方,再打开 不过有些其它设置也会丢失,需要重新设置,参见Source_Insight破解版下载 ...
- 状压DP POJ 2411 Mondriaan'sDream
题目传送门 /* 题意:一个h*w的矩阵(1<=h,w<=11),只能放1*2的模块,问完全覆盖的不同放发有多少种? 状态压缩DP第一道:dp[i][j] 代表第i行的j状态下的种数(状态 ...
- ural 1247. Check a Sequence
1247. Check a Sequence Time limit: 0.5 secondMemory limit: 64 MB There is a sequence of integer numb ...
- CodeForces Round 195 Div2
A. Vasily the Bear and Triangletime limit per test1 secondmemory limit per test256 megabytesinputsta ...
- BZOJ3532 : [Sdoi2014]Lis
f[i]表示以i为结尾的LIS长度 对于所有f[i]=1的,由S向i连边 对于所有f[i]=maxf的,由i向T连边 对于j<i,a[j]<a[i],且f[j]+1=f[i]的,j向i连边 ...
- 【POJ】2299 Ultra-QuickSort(逆序对)
http://poj.org/problem?id=2299 在两个元素相同的数列里,其中一个数列要移动到另一个数列相同元素相同的位置,那么要移动的次数就是这个数列关于另一个数列的逆序对数(hash后 ...
- 【BZOJ】1821: [JSOI2010]Group 部落划分 Group(最小生成树+贪心)
http://www.lydsy.com:808/JudgeOnline/problem.php?id=1821 这题裸题. 本题要求最短距离最长,很明显,我们排序. 这里存在贪心,即我们把边权最小的 ...
- BZOJ4260: Codechef REBXOR
Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. Output 输出一行包含给定表达式可能的最大值. S ...