JavaScript 工厂模式
核心是生产对象,实现解耦
粗粒度简单工厂
/**
* 搭建一个工厂的环境
*/
// 卖车的商店
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论