JavaScript 工厂模式

发布于 2024-08-28 10:37:22 字数 4350 浏览 14 评论 0

核心是生产对象,实现解耦

粗粒度简单工厂

/**
 * 搭建一个工厂的环境
 */

// 卖车的商店
function CarShop(){};
CarShop.prototype = {
  constructor: CarShop,
  sellCar: function(type) {
   return CarFactory.createCar(type);
  }
};

// 生产车的工厂,目的就是为了生产车
// 单例模式(不能被 new 关键字实例化)
const CarFactory = {
  createCar: function(type) {
    let car;
    switch(type) {
      case 'Benz': car = new Benz(); break;
      case 'Bmw': car = new Bmw(); break;
      case 'Audi': car = new Audi(); break;
      default: 'not buy it';
    }
    BH.interface.ensureImplements(car, CarInterface); // 验证是否实现了具体的方法
    return car;
  }
}


// 接口对象的示例
const CarInterface = new BH.interface('CarInterface', ['statr', 'run'])

// SuperClass 
function BaseCar(){};
BaseCar.prototype = {
  constructor: BaseCar,
  start: function(){
    alert(this.constructor.name + "start")
  },
  run: function() {
    alert(this.constructor.name + "run...")
  }
}

// Class benz bmw audi (都是车)
// 注意关键问题:子类先继承父类 子类在扩展子类自己特有的方法
function Benz(){}; 
// Benz.prototype.driveBenz = function(){alert('Benz..drive')}; 
// Benz.prototype.run = function(){alert('Benz..run')};
BH.extend(Benz,BaseCar); 
Benz.prototype.driveBenz = function(){alert('Benz..drive')}; 

function Bmw(){};
// Bmw.prototype.driveBmw = function(){alert('Bmw..drive')};
// Bmw.prototype.run = function(){alert('Bmw..run')};	
BH.extend(Bmw,BaseCar);
Bmw.prototype.driveBmw = function(){alert('Bmw..drive')};

function Audi(){};
// Audi.prototype.driveAudi = function(){alert('Audi..drive')};
// Audi.prototype.run = function(){alert('Audi..run')};	
BH.extend(Audi,BaseCar);
Audi.prototype.driveAudi = function(){alert('Audi..drive')};

const shop = new CarShop();
const car = shop.sellCar('Benz');
car.start();
car.run();
car.driveBenz();

细粒度简单工厂

function CarShop(){};// 抽象类
CarShop.prototype = {
  constructor : CarShop ,
  sellCar:function(type){
    // 销售人员...
    // var car = CarFactory.createCar(type);
    // 保险、相关的售后服务
    //return car ;
    this.abstractSellCar(type);
  } ,
  abstractSellCar: function(){
    throw new Error('this method is abstract...');
  }
};

// Benz 4s 店 继承抽象类,实现具体方法
function BenzCarShop(){};
BH.extend(BenzCarShop,CarShop); 
BenzCarShop.prototype = {
  constructor: BenzCarShop,
  sellCar: function(type) {
    let car ; // 声明一个变量
    let types = ['Benz'];	//所有 benz 类型的汽车
    for(t in types){
      // 如果我的商店里有你想要汽车型号
      if(types[t] === type){
        car = CarFactory.createCar(type);
      } else { 
        alert('没有你要的型号!');
      }
    }
    return car ;
  }
}
// 宝马  4s 店 
function BmwCarShop(){};
BH.extend(BmwCarShop,CarShop);
BmwCarShop.prototype = {
  constructor:BmwCarShop ,
  sellCar:function(type){
    var car ; // 声明一个变量
    var types = ['Bmw'];	//所有 bmw 类型的汽车
    for(t in types){
      // 如果我的商店里有你想要汽车型号
      if(types[t] === type){
        car = CarFactory.createCar(type);
      } else { 
        alert('没有你要的型号!');
      }
    }
    return car ;
  }					
};	

//生产车的工厂 目的就是为了生产车
//单体模式 动态工厂模式
const CarFactory = {
  createCar: function(type){
    // var car = new Benz();
    // 利用 eval 动态创建传入类型的实例对象
    var car = eval('new '+type+'()');
    //检验接口实现
    BH.Interface.ensureImplements(car ,CarInterface);
    return car ;						
  }
};

// 接口对象的实例
var CarInterface = new BH.Interface('CarInterface' ,['start','run']);

// SuperClass  implements CarInterface 
function BaseCar(){};
BaseCar.prototype = {
  constructor:BaseCar , 
  start:function(){
    alert(this.constructor.name + ' ..start');
  },
  run:function(){
    alert(this.constructor.name + ' ..run');
  }
};


// Class benz bmw audi (都是车)
// 注意关键问题:子类先继承父类 子类在扩展子类自己特有的方法

function Benz(){}; 
BH.extend(Benz,BaseCar); 
Benz.prototype.driveBenz = function(){alert('Benz..drive')}; 
//Benz.prototype.run = function(){alert('Benz..run')};

function Bmw(){};
BH.extend(Bmw,BaseCar);
Bmw.prototype.driveBmw = function(){alert('Bmw..drive')};
//Bmw.prototype.run = function(){alert('Bmw..run')};	

function Audi(){};
BH.extend(Audi,BaseCar);
Audi.prototype.driveAudi = function(){alert('Audi..drive')};
//Audi.prototype.run = function(){alert('Audi..run')};	
var shop1 = new BenzCarShop();
var car1 = shop1.sellCar('Benz');
car1.run();

var shop2 = new BmwCarShop();
var car2 = shop2.sellCar('Bmw');
car2.run();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

浪漫之都

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

謌踐踏愛綪

文章 0 评论 0

开始看清了

文章 0 评论 0

高速公鹿

文章 0 评论 0

alipaysp_PLnULTzf66

文章 0 评论 0

热情消退

文章 0 评论 0

白色月光

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文