设计模式--增强工厂、安全工厂

增强工厂


    // 通过类来创建对象
function People(name,age,sex){
    this.name = name ;
    this.age = age;
    this.sex = sex;
}
    // 方法
People.prototype.intro = function (){
    console.log('我是'+this.name+'性别是'+this.sex+'今年'+this.age);
}
    // 创建实例
var p1 = new People('小白',20,'男');
var p2 = new People('小红',21,'女');
var p3 = new People('小兰',21,'女');
// 相同的行为
p1.intro();
p2.intro();
p3.intro();
    // 增强型工厂
function factory(name ,age ,sex){
//     创建
    var p = new People(name,age,sex);
//     增强
    if(p.sex==='女'){
        p.msg='hello'
        p.say = function (){
            console.log(this.msg)
        }
    }
    return p;
}
    // 通过工厂创建实例
var p4 = factory('小青',22,'女');
var p5 = factory('小绿',21,'男');
p4.intro();
p5.intro();
console.log(p4);
console.log(p5);
    // 增强方法
p4.say();
p5.say()
    // 没有增强 不能使用该方法
p1.say()
    // 不影响原来类的创建
var p6= new People('小紫',33,'女');
p6.intro()

安全工厂


// 创建数组
var arr1 = new Array(1,2,3)
var arr2 = Array(4,5,6)
console.log(arr1);
console.log(arr2)
// 从类的角度看 是安全类 从工厂角度 是安全工厂
// 通过类来创建
function People(name,age,sex){
  // 判断this指向
  if(this instanceof People){
    // 正常存数据
    this.name = name ;
    this.age = age;
    this.sex = sex;
  } else {
  //   重新实例化
    return new People(name,age,sex);
  }

}
// 方法
People.prototype.intro = function (){
  console.log('我是'+this.name+'性别是'+this.sex+'今年'+this.age);
}
// 创建示例
var p1 = new People('小白',20,'男')
var p2 = People('小红',21,'女')
console.log(p1)
console.log(p2)

工厂方法


  // 创建动物
  // 创建狗
  function Dog(name){
    this.type = '狗';
    this.name = name;
  }
  // 创建猫
  function Cat(name){
    this.type = '猫'
    this.name = name
  }
//   创建猪
function Pig(name){
  this.type = '猪'
  this.name = name
}
// 创建动物
// var dog = new Dog('老大')
// var pig = new Pig('老二')
// var cat = new Cat('老三')

// 通过工厂方法创建
function animal(name,type){
//   根据类型区分类
  if(type==='狗'){
    return new Dog(name)
  } else if (type ==='猫'){
    return new Cat(name)
  } else {
    return new Pig(name)
  }
}
var p1 = animal('老大','猫')

你可能感兴趣的:(设计模式,javascript,前端)