<script type="text/javascript"> //BMW Car function VehicleFactory(subType, superType) { if (typeof VehicleFactory[superType] === 'function') { function F() {} F.prototype = new VehicleFactory[superType]() subType.constructor = subType//prototype已经赋值,下文不能赋值{},这样会删除以前的原型赋值 subType.prototype = new F() } else { throw new Error('未创建该抽象类') } } /* 定义抽象类的结构 */ // 汽车抽象类 VehicleFactory.Car = function() { this.type = 'car' } VehicleFactory.Car.prototype = { getPrice() { return new Error('抽象方法不能调用') }, getSpeed() { return new Error('抽象方法不能调用') } } // 公交车抽象类 VehicleFactory.Bus = function() { this.type = 'bus' } VehicleFactory.Bus.prototype = { getPrice() { return new Error('抽象方法不能调用') }, getPassengerNum() { return new Error('抽象方法不能调用') } } // 货车抽象类 VehicleFactory.Truck = function() { this.type = 'truck' } VehicleFactory.Truck.prototype = { getPrice() { return new Error('抽象方法不能调用') }, getTrainload() { return new Error('抽象方法不能调用') } } //实现具体的类则如下: // 汽车:宝马具体类 function BMW(price, speed) { this.price = price this.speed = speed } VehicleFactory(BMW, 'Car') BMW.prototype.getPrice = function() { return this.price } BMW.prototype.getSpeed = function() { return this.speed } //当需要生产实例时,则: const bmw530 = new BMW(500000, 250) console.log( bmw530.getPrice() ) // 500000 console.log( bmw530.getSpeed() ) // 250 console.log( bmw530.type );// 'Car' </script>
抽象类工厂模式很巧妙的使用了函数也是对象,也可以由很多的属性的方法
在很多软件系统中需要更换界面主题,要求界面中的按钮、文本框、背景色等一起发生改变时,可以使用抽象工厂模式进行设计。
实例:
<head> <style> #div1 { 200px; height:200px; border:1px solid black; } </style> </head> <body> <input type='button' value='red'/> <input type='button' value='blue'/> <input type='button' value='black'/> <div id='div1'></div> <script type="text/javascript"> var oDiv = document.getElementById('div1'); var aBtn = document.getElementsByTagName('input'); function factory(subtype,supertype){ if (typeof factory[supertype] === 'function') { function fn(){} fn.prototype = new factory[supertype] subtype.constructor = subtype subtype.prototype = new fn() }else { throw new Error('没有此抽象类'); } } factory.color1 = function(){ this.color = 'red' } factory.color2 = function(){ this.color = 'blue' } factory.color3 = function(){ this.color = 'black' } for (var i = 0;i<aBtn.length ;i++ ) { (function(i){ aBtn[i].addEventListener('click',function(){ var j = i+1; function c1(){} factory(c1,'color'+j) oDiv.style.background = (new c1()).color; },false); })(i); } </script> </body>