1 <!doctype html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>抽线工厂</title>
  6 </head>
  7 <body>
  8
  9 <script>
 10 /**
 11  * 抽象工厂模式
 12  *
 13  * 定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。
 14  *
 15  * 本质:
 16  * 选择产品簇的实现。
 17  *
 18  * 功能:
 19  * 为一系列相关对象或相互依赖的对象创建一个接口。这个接口内的方法不是任意堆砌的,而是一系列相关或相互依赖的方法。
 20  * 从某种意义上看,抽象工厂其实是一个产品系列,或者是产品簇。
 21  *
 22  * 使用工厂方法来实现抽象工厂。
 23  *
 24  * 工厂方法是选择单个产品的实现,虽然一个类里面可以有多个工厂方法,但是这些方法之间一般是没有联系的,即使看起来像有联系。
 25  * 但是抽象工厂着重的就是为一个产品簇选择实现,定义在抽象工厂里面的方法通常是由联系的,它们都是产品的某一部分或者是相互依赖的。如果抽象工厂里面只定义一个方法,直接创建产品,那么就退化成为工厂方法。
 26  *
 27  * 何时使用?
 28  * 1.如果希望一个系统独立于它的产品的创建,组合和表示的时候。也就是一个系统只是知道产品的接口,而不关心实现的时候、
 29  * 2.如果一个系统要由多个产品系列中的一个来配置的时候。也就是可以动态地切换产品簇的时候。
 30  * 3.如果要强调一系列相关产品的接口,以便联合使用它们的时候。
 31  *
 32  * 优点:
 33  * 分离接口和实现
 34  * 使得切换产品簇变得容易
 35  *
 36  * 缺点:
 37  * 不太容易扩展新产品
 38  * 容易造成雷层次复杂
 39  *
 40  * 抽象工厂模式和单例模式
 41  * 这两个模式可以组合使用。
 42  * 在抽象工厂模式里面,具体的工厂实现,在整个应用中,通常一个产品系列只需要一个实例就可以了,因此可以把具体的工厂实现成为单例。
 43  *
 44  */
 45 // 示例代码:
 46 /**
 47  * 抽象工厂的接口,声明创建抽象产品对象的操作
 48  */
 49 var AbstractFactory = function () {};
 50 AbstractFactory.prototype = {
 51     /**
 52      * 示例方法,创建抽象产品A的对象
 53      * @return {[type]} 抽象产品A的对象
 54      */
 55     createProductA: function () {},
 56     // 创建抽象产品B
 57     createProductB: function () {}
 58 };
 59
 60 /**
 61  * 抽象产品A,B的接口
 62  */
 63 var AbstractProductA = function () {};
 64 // ...
 65 var AbstractProductB = function () {};
 66 // ...
 67
 68 // 产品A的实现
 69 var ProductA1 = function () {};
 70 ProductA1.prototype = Object.create(AbstractProductA.prototype);
 71 // ...
 72
 73 var ProductA2 = function () {};
 74 ProductA2.prototype = Object.create(AbstractProductA.prototype);
 75 // ...
 76
 77 // 产品B的实现
 78 var ProductB1 = function () {};
 79 ProductB1.prototype = Object.create(AbstractProductB.prototype);
 80 // ...
 81
 82 var ProductB2 = function () {};
 83 ProductB2.prototype = Object.create(AbstractProductB.prototype);
 84 // ...
 85
 86 /**
 87  * 具体的工厂实现对象,实现创建具体的产品对象的操作
 88  */
 89 var ConcretFactory1 = function () {};
 90 ConcretFactory1.prototype = Object.create(AbstractFactory.prototype);
 91 ConcretFactory1.prototype.createProductA = function () {
 92     return new ProductA1();
 93 };
 94 ConcretFactory1.prototype.createProductB = function () {
 95     return new ProductB1();
 96 };
 97
 98 var ConcretFactory2 = function () {};
 99 ConcretFactory2.prototype = Object.create(AbstractFactory.prototype);
100 ConcretFactory2.prototype.createProductA = function () {
101     return new ProductA2();
102 };
103 ConcretFactory2.prototype.createProductB = function () {
104     return new ProductB2();
105 };
106
107 // 客户端
108 var af = new ConcretFactory1();
109 af.createProductA();
110 af.createProductB();
111
112
113 // 示例2
114 var AMDCPU = function (id) {
115     this.id = id;
116 };
117 var MSIMainboard = function (id) {
118     this.id = id;
119 };
120
121 var Schema1 = function () {};
122 Schema1.prototype = {
123     createCPUApi: function () {
124         return new AMDCPU(939);
125     },
126     createMainboardApi: function () {
127         return new MSIMainboard(939);
128     }
129 };
130
131 var Schema2 = function () {};
132 Schema2 = {
133     createCPUApi: function () {
134         return new AMDCPU(1000);
135     },
136     createMainboardApi: function () {
137         return new MSIMainboard(1000);
138     }
139 };
140
141 var ComputerEngineer = (function () {
142     var cpu;
143     var mainboard;
144
145     function prepareHardWare(schema) {
146         cpu = schema.createCPUApi();
147         mainboard = schema.createMainboardApi();
148         console.log('prepared');
149     }
150
151     var ComputerEngineer = function () {
152         cpu = null;
153         mainboard = null;
154     };
155     ComputerEngineer.prototype = {
156         makeComputer: function (schema) {
157             prepareHardWare(schema);
158         }
159     };
160
161     return ComputerEngineer;
162 }());
163
164 var engineer = new ComputerEngineer();
165 var schema = new Schema1();
166 engineer.makeComputer(schema);
167 engineer = schema = null;
168
169
170 // http://www.dofactory.com/javascript-abstract-factory-pattern.aspx
171
172 function Employee(name) {
173     this.name = name;
174     this.say = function () {
175         log.add("I am employee " + name);
176     };
177 }
178
179 function EmployeeFactory() {
180     this.create = function (name) {
181         return new Employee(name);
182     };
183 }
184
185 function Vendor(name) {
186     this.name = name;
187     this.say = function () {
188         log.add("I am vendor " + name);
189     };
190 }
191
192 function VendorFactory() {
193     this.create = function (name) {
194         return new Vendor(name);
195     };
196 }
197
198 // log helper
199 var log = (function () {
200     var log = "";
201     return {
202         add: function (msg) { log += msg + "\n"; },
203         show: function () {
204             alert(log);
205             log = "";
206         }
207     }
208 })();
209
210
211 function run() {
212
213     var persons = [];
214
215     var employeeFactory = new EmployeeFactory();
216     var vendorFactory = new VendorFactory();
217
218     persons.push(employeeFactory.create("Joan DiSilva"));
219     persons.push(employeeFactory.create("Tim O'Neill"));
220
221     persons.push(vendorFactory.create("Gerald Watson"));
222     persons.push(vendorFactory.create("Nicole McNight"));
223
224     for (var i = 0, len = persons.length; i < len; i++) {
225         persons[i].say();
226     }
227
228     log.show();
229 }
230 </script>
231 </body>
232 </html>

转载于:https://www.cnblogs.com/webFrontDev/p/3553373.html

javascript设计模式-抽象工厂模式相关推荐

  1. JavaScript设计模式———抽象工厂模式

    定义: 抽象工厂其实是实现子类继承父类的方法,只是一个方法.抽象工厂模式一般用在多人协作的超大型项目中,并且严格的要求项目以面向对象的思想进行完成. 简单工厂模式和工厂模式都是直接生产实例的,抽象工厂 ...

  2. JavaScript设计模式 - 抽象工厂模式

    抽象工厂模式 这也是针对工厂模式无法应对多对象多复杂对象而出的一种模式,抽象工厂模式并不是直接生成实例,而是对于产品的一个分类的创建 class User {constructor(name, rol ...

  3. javascript设计模式--抽象工厂模式

    抽象工厂模式(abstract Fctory):通过对类的工厂抽象使其业务用于对产品类鏃的创建,而不负责创建某一类产品的实例. //汽车抽象类,当使用其实例对象的方法时会抛出错误var Car = f ...

  4. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  5. 系统架构技能之设计模式-抽象工厂模式

    一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...

  6. 常见设计模式—抽象工厂模式

    设计模式-抽象工厂模式 1.什么是抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其它工厂,是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品. 2.角色分 ...

  7. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  8. JavaScript高级进阶之设计模式 抽象工厂模式

    抽象工厂模式 负责同一类的产品,但是不对负责某一个产品的实例,实例的任务交给创建某个产品的方法 /*** @param {Object} fun 需要抽象的方法体 函数* @param {Object ...

  9. java设计模式---抽象工厂模式

    工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 以开发项目的DAO层为例,在项 ...

最新文章

  1. matlab“机器学习和深度学习”系列工具箱作用总结
  2. 安居客检测到网页抓取_安居客天津租房情况分析
  3. 2014.12.10 OC基础复习
  4. IIS服务中五种身份验证的灵活运用-转
  5. jquery-1.10.2.min.map是什么,怎么用?
  6. 学习使用autotools
  7. 《现代汉语》北大公开课
  8. matlab fill 图案填充,Matlab条形图中填充图案
  9. winows10和centos 双系统 安装记录
  10. 六轴机械臂下位机(arduino)+上位机(ROS+Moveit)---(一)机械臂硬件
  11. ps切片 html作用,ps切片有什么用,PS切片是什么
  12. 最新最全python镜像源-(转)
  13. 这几种母乳才不能吃,“隔夜”的母乳不能吃?那是对母乳不够了解
  14. 替补者的旅行(巨长,慎入)
  15. 用 Python 来理一理红楼梦里的那些关系
  16. 从原理到接法全面了解三相电
  17. nRF52832学习记录(十、PWM 脉冲调制)
  18. springboot文件上传提示临时文件夹不存在
  19. SAP HANA SQL获取当前日期加若干天后的日期
  20. 深入浅出谈人脸识别技术

热门文章

  1. 计算机科学之美,计算机科学的美学探讨
  2. 慢雾安全工程师:安全审计是目前保护 DeFi 项目安全最高性价比的方式
  3. 今日恐慌与贪婪指数为92 贪婪程度有所上升
  4. SAP License:赛锐信息访谈启示录(五)
  5. SAP License:成本不是靠算出来的
  6. SAP License:SAP中的报表利器Report Painter
  7. 存量客户管理之提额降息
  8. DataTable分组
  9. asp.net core mcroservices 架构之 分布式日志(二)之自定义日志开发
  10. 利用Python分析羊车门问题