简单工厂模式

  简单工厂模式,又称静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要是用来创建同一类对象

 1 // 简单工厂模式
 2 // 登录警示框类,提示输入内容不符合规范
 3 var LoginAlert = function(text) {
 4     this.content = text;
 5 }
 6 LoginAlert.prototype.show = function() {
 7     console.log(this.content);
 8 }
 9 
10 // 登录警示框增加注册按钮,用户不存在时可以注册账号
11 var LoginConfirm = function(text) {
12     this.content = text;
13     this.confirm = true;
14 }
15 LoginConfirm.prototype.show = function() {
16     console.log(this.content);
17 }
18 
19 // 登录成功后,显示的提示框有个确认按钮
20 var LoginPrompt = function(text) {
21     this.content = text;
22     this.isLogin = true;
23 }
24 LoginPrompt.prototype.show = function() {
25     console.log(this.content);
26 }
27 
28 // 简单工厂模式
29 var PopFactory = function(name, content) {
30     switch(name) {
31         case 'alert': {
32             return new LoginAlert(content)
33         }
34         case 'confirm': {
35             return new LoginConfirm(content);
36         }
37         case 'prompt': {
38             return new LoginPrompt(content);
39         }
40     }
41 }
42 
43 // 测试类
44 var userAlert = new PopFactory('alert', '用户名不能多于16个数字或字母');
45 userAlert.show();
46 
47 var userConfirm = new PopFactory('confirm', '您的用户名不存在,请重新输入');
48 userConfirm.show();
49 
50 var userPrompt = new PopFactory('prompt', '欢迎回来');
51 userPrompt.show();

  一个对象有时也能代替许多类。简单工厂模式的理念就是创建对象,对不同的类实例化。不过除此之外简单工厂模式还可以用来创建相似对象,把相似的东西提取出来,不相似的针对性处理。有点像继承是的寄生模式,只是这里没有父类,无需任何继承,简单创建一个对象,通过对这个对象大量拓展方法和属性,并在最终将对象返回出来。

 1 // 一个对象代替许多类
 2 function createPop(type, text) {
 3     // 创建一个对象,并对对象拓展属性和方法
 4     var o = new Object();
 5     o.content = text;
 6     o.show = function() {
 7         console.log(o.content);
 8     }
 9     if(type == 'alert') {
10 
11     }
12     if(type == 'prompt') {
13         o.isLogin = true;
14     }
15     if(type == 'confirm') {
16         this.confirm = true;
17     }
18     return o;
19 }
20 
21 // 测试类
22 var userNameAlert = createPop('alert', '用户名不能多于26个数字或字母');
23 userNameAlert.show();

两种方法比较

1、区别:第一种通过类实例化对象创建的,第二种是通过创建一个新对象然后包装增强其属性和功能来实现的。

2、后果:它们之间的差异性也造成了前面通过类创建属性的,如果这些类继承同一个父类,那么它们父类原型上的方法是共用的。而后面寄生方式创建的对象都是一个新的个体,所以他们的方法就不能共用了。

参考资料:《JavaScript设计模式》