<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>抽线工厂</title>
</head>
<body> <script>
/**
* 抽象工厂模式
*
* 定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。
*
* 本质:
* 选择产品簇的实现。
*
* 功能:
* 为一系列相关对象或相互依赖的对象创建一个接口。这个接口内的方法不是任意堆砌的,而是一系列相关或相互依赖的方法。
* 从某种意义上看,抽象工厂其实是一个产品系列,或者是产品簇。
*
* 使用工厂方法来实现抽象工厂。
*
* 工厂方法是选择单个产品的实现,虽然一个类里面可以有多个工厂方法,但是这些方法之间一般是没有联系的,即使看起来像有联系。
* 但是抽象工厂着重的就是为一个产品簇选择实现,定义在抽象工厂里面的方法通常是由联系的,它们都是产品的某一部分或者是相互依赖的。如果抽象工厂里面只定义一个方法,直接创建产品,那么就退化成为工厂方法。
*
* 何时使用?
* 1.如果希望一个系统独立于它的产品的创建,组合和表示的时候。也就是一个系统只是知道产品的接口,而不关心实现的时候、
* 2.如果一个系统要由多个产品系列中的一个来配置的时候。也就是可以动态地切换产品簇的时候。
* 3.如果要强调一系列相关产品的接口,以便联合使用它们的时候。
*
* 优点:
* 分离接口和实现
* 使得切换产品簇变得容易
*
* 缺点:
* 不太容易扩展新产品
* 容易造成雷层次复杂
*
* 抽象工厂模式和单例模式
* 这两个模式可以组合使用。
* 在抽象工厂模式里面,具体的工厂实现,在整个应用中,通常一个产品系列只需要一个实例就可以了,因此可以把具体的工厂实现成为单例。
*
*/
// 示例代码:
/**
* 抽象工厂的接口,声明创建抽象产品对象的操作
*/
var AbstractFactory = function () {};
AbstractFactory.prototype = {
/**
* 示例方法,创建抽象产品A的对象
* @return {[type]} 抽象产品A的对象
*/
createProductA: function () {},
// 创建抽象产品B
createProductB: function () {}
}; /**
* 抽象产品A,B的接口
*/
var AbstractProductA = function () {};
// ...
var AbstractProductB = function () {};
// ... // 产品A的实现
var ProductA1 = function () {};
ProductA1.prototype = Object.create(AbstractProductA.prototype);
// ... var ProductA2 = function () {};
ProductA2.prototype = Object.create(AbstractProductA.prototype);
// ... // 产品B的实现
var ProductB1 = function () {};
ProductB1.prototype = Object.create(AbstractProductB.prototype);
// ... var ProductB2 = function () {};
ProductB2.prototype = Object.create(AbstractProductB.prototype);
// ... /**
* 具体的工厂实现对象,实现创建具体的产品对象的操作
*/
var ConcretFactory1 = function () {};
ConcretFactory1.prototype = Object.create(AbstractFactory.prototype);
ConcretFactory1.prototype.createProductA = function () {
return new ProductA1();
};
ConcretFactory1.prototype.createProductB = function () {
return new ProductB1();
}; var ConcretFactory2 = function () {};
ConcretFactory2.prototype = Object.create(AbstractFactory.prototype);
ConcretFactory2.prototype.createProductA = function () {
return new ProductA2();
};
ConcretFactory2.prototype.createProductB = function () {
return new ProductB2();
}; // 客户端
var af = new ConcretFactory1();
af.createProductA();
af.createProductB(); // 示例2
var AMDCPU = function (id) {
this.id = id;
};
var MSIMainboard = function (id) {
this.id = id;
}; var Schema1 = function () {};
Schema1.prototype = {
createCPUApi: function () {
return new AMDCPU(939);
},
createMainboardApi: function () {
return new MSIMainboard(939);
}
}; var Schema2 = function () {};
Schema2 = {
createCPUApi: function () {
return new AMDCPU(1000);
},
createMainboardApi: function () {
return new MSIMainboard(1000);
}
}; var ComputerEngineer = (function () {
var cpu;
var mainboard; function prepareHardWare(schema) {
cpu = schema.createCPUApi();
mainboard = schema.createMainboardApi();
console.log('prepared');
} var ComputerEngineer = function () {
cpu = null;
mainboard = null;
};
ComputerEngineer.prototype = {
makeComputer: function (schema) {
prepareHardWare(schema);
}
}; return ComputerEngineer;
}()); var engineer = new ComputerEngineer();
var schema = new Schema1();
engineer.makeComputer(schema);
engineer = schema = null; // http://www.dofactory.com/javascript-abstract-factory-pattern.aspx function Employee(name) {
this.name = name;
this.say = function () {
log.add("I am employee " + name);
};
} function EmployeeFactory() {
this.create = function (name) {
return new Employee(name);
};
} function Vendor(name) {
this.name = name;
this.say = function () {
log.add("I am vendor " + name);
};
} function VendorFactory() {
this.create = function (name) {
return new Vendor(name);
};
} // log helper
var log = (function () {
var log = "";
return {
add: function (msg) { log += msg + "\n"; },
show: function () {
alert(log);
log = "";
}
}
})(); function run() { var persons = []; var employeeFactory = new EmployeeFactory();
var vendorFactory = new VendorFactory(); persons.push(employeeFactory.create("Joan DiSilva"));
persons.push(employeeFactory.create("Tim O'Neill")); persons.push(vendorFactory.create("Gerald Watson"));
persons.push(vendorFactory.create("Nicole McNight")); for (var i = 0, len = persons.length; i < len; i++) {
persons[i].say();
} log.show();
}
</script>
</body>
</html>

javascript设计模式-抽象工厂模式的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. [设计模式] javascript 之 抽象工厂模式

    抽象工厂模式说明 1. 工厂方法模式的问题: 在工厂方法模式里,创建类都需要通过 工厂类,如果要扩展程序,就必须修改工厂类,这违背了闭包原则,对扩展开放,对修改关闭:对于设计有一定的问题. 2. 如何 ...

  4. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  5. 深入浅出设计模式——抽象工厂模式(Abstract Factory)

    模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...

  6. 24种设计模式--抽象工厂模式【Abstract Factory Pattern】

    女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类 ...

  7. C++设计模式——抽象工厂模式

    问题描述 之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Produ ...

  8. 设计模式 | 抽象工厂模式(abstract factory)

    定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...

  9. 设计模式 — 抽象工厂模式(Abstract Factory)

    工厂模式已经分析了简单工厂模式和工厂方法模式.并且了解了工厂方法模式去简单工厂模式的延伸,工厂方法模式如果不把工厂类抽象的话,就是简单工厂模式.由前面两个工厂模式可以猜测出抽象工厂模式应该是这两种工厂 ...

随机推荐

  1. 下一代NoSQL:最终一致性的末日

    相比关系型数据库,NoSQL解决方案提供了shared-nothing.容错和可扩展的分布式架构等特性,同时也放弃了关系型数据库的强数据一致性和隔离性,美其名曰:"最终一致性". ...

  2. Android请求返回417解决办法

    今天碰到个很奇怪的问题,APP通过代理链接服务器会收到HTTP 417错误,经过网上查找发现是由于以下代码造成: HttpParams params = new BasicHttpParams(); ...

  3. Linux下如何查看JDK安装路径

    1:echo $JAVA_HOME 使用$JAVA_HOME的话能定位JDK的安装路径的前提是配置了环境变量$JAVA_HOME,否则如下所示,根本定位不到JDK的安装路径 [root@localho ...

  4. MySql 用户 及权限操作

    bin/msyql -h host -u user -p    bin/mysql -u mysql -p  本地登录 如无密码按回车直接进入mySql   bin/mysqladmin -u roo ...

  5. Android:ViewPager实现屏幕轮转和使用PagerTabStrip

    ① ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的view类. ② ViewPager类需要一个PagerAdapter适配器类给它提供数据. ③ Vie ...

  6. hdu 4006/AvlTree

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4006 这道题以前用c语言写的Avltree水过了.. 现在接触了c++重写一遍... 由于没有删除操作 ...

  7. EF6 在原有数据库中使用 CodeFirst 总复习(三、重建迁移)

    本来原来学的时候,挺顺利的,没想到再次使用,还是遇到很多问题,导致更新失败,所以,只能重建迁移,免得看着乱乱的. 一.删除迁移,将数据恢复到(一)结束状态 1.删除文件夹 2.删除表 3.删除列 4. ...

  8. Datawarehouse

  9. JavaScript美术馆进化史

    内容选自<<JavaScript DOM 编程艺术>>第4-6章,跟着作者一起见证美术馆的进化吧. 先放效果图,然后一步步做出每个效果.每个效果都有它实用的地方,且知道过程可以 ...

  10. Log4Net学习【二】

    Log4Net结构详解 当我们在描述为系统做日志这个动作的时候,实际上描述了3个点:做日志,其实就是在规定,在什么地方 用什么日志记录器 以什么样的格式做日志.把三个最重要的点抽取出来,即什么地方,日 ...