设计模式知识连载(15)---抽象工厂模式:
来源:互联网 发布:自定义注解 java 编辑:程序博客网 时间:2024/06/05 18:02
<body><h3>设计模式知识连载(15)---抽象工厂模式:</h3><p> 抽象工厂模式:通过对类的工厂抽象使其业务用于对产品类簇的创建(制定了类的结构), 而不负责创建某一类产品的实例。唯一一种抽象化创建模式</p><script type="text/javascript"> /** * 案例 */ // (了解抽象类用的)汽车抽象类【父类】,当使用其 实例对象的方法时会抛出错误 var Car = function () {} ; Car.prototype = { getPrice : function() { return new Error('抽象方法不能调用') ; }, getSpeed : function() { return new Error('抽象方法不能调用') ; } } ; /*-------------------------------------------------------*/ // 抽象工厂方法 var VehicleFactory = function(subType, superType) { // 判断抽象工厂中是否有该抽象类 if( typeof VehicleFactory[superType] === 'function') { // 缓存类 function F() {} ; // 继承父类属性和方法 F.prototype = new VehicleFactory[superType]() ; // 将子类constructor指向子类 subType.constructor = subType ; // 子类原型继承“父类” subType.prototype = new F() ; }else{ // 不存在该抽象类时,抛出错误 throw new Error('未创建该抽象类') ; } } ; // 小汽车抽象类 VehicleFactory.Car = function() { this.type = 'car' ; } ; VehicleFactory.Car.prototype = { getPrice : function() { return new Error('抽象方法不能调用') ; }, getSpeed : function() { return new Error('抽象方法不能调用') ; } } ; // 公交车抽象类 VehicleFactory.Bus = function(){ this.type = 'bus' ; } ; VehicleFactory.Bus.prototype = { getPrice : function() { return new Error('抽象方法不能调用') ; }, getSpeed : function() { return new Error('抽象方法不能调用') ; } } ; // 货车抽象类 VehicleFactory.Truck = function() { this.type = 'truck' ; } ; VehicleFactory.Truck.prototype = { getPrice : function() { return new Error('抽象方法不能调用') ; }, getSpeed : function() { return new Error('抽象方法不能调用') ; } } ; // 抽象和实现 // 宝马汽车子类 var BMW = function(price, speed) { this.price = price ; this.speed = speed ; } ; // 抽象工厂实现对Car抽象类的继承 // VehicleFactory(BMW, Car) ; // Uncaught Error: 未创建该抽象类 VehicleFactory(BMW, 'Car') ; /* * 这样写,等价于把BMW.prototype原有的内容都覆盖了。 * 所以会导致bmw.type = 'undefined' */ // BMW.prototype = { // getPrice : function() { // return this.price ; // }, // getSpeed : function() { // return this.speed ; // } // } ; /* * 这样写,才是在BMW.prototype原有的基础上添加 * 因此bmw.type = 'car' */ BMW.prototype.getPrice = function() { return this.price ; } ; BMW.prototype.getSpeed = function() { return this.speed ; } ; // 兰博基尼汽车子类 var Lamborghini = function(price, speed) { this.price = price ; this.speed = speed ; } ; // 抽象工厂实现对Car抽象类的继承 VehicleFactory(Lamborghini, 'Car') ; Lamborghini.prototype.getPrice = function() { return this.price ; } ; Lamborghini.prototype.getSpeed = function() { return this.speed ; } ; // 宇通汽车子类 var YUTONG = function(price, passenger) { this.price = price ; this.passenger = passenger ; } ; // 抽象工厂实现对Car抽象类的继承 VehicleFactory(YUTONG, 'Bus') ; YUTONG.prototype.getPrice = function() { return this.price ; } ; YUTONG.prototype.getPassengerNum = function() { return this.passenger ; } // 奔驰汽车子类 var BenzTruck = function(price, trainLoad) { this.price = price ; this.trainLoad = trainLoad ; } ; // 抽象工厂实现对Car抽象类的继承 VehicleFactory(BenzTruck, 'Truck') ; BenzTruck.prototype.getPrice = function() { return this.price ; } ; BenzTruck.prototype.getTrainLoad = function() { return this.trainLoad ; } ; // 实例化 var bmw = new BMW(200000, 200) ; var lamborghini = new Lamborghini(300000, 300) ; var yutong = new YUTONG(100000, 10) ; var benz = new BenzTruck(500000, '柏油马路') ; console.log('宝马汽车子类--------------------------------------------------') ; console.log('bmw:', bmw) ; console.log('bmw.type:', bmw.type) ; console.log('bmw.getPrice:', bmw.getPrice()) ; console.log('bmw.getSpeed:', bmw.getSpeed()) ; console.log('兰博基尼汽车子类----------------------------------------------') ; console.log('lamborghini:', lamborghini) ; console.log('lamborghini.type:', lamborghini.type) ; console.log('lamborghini.tgetPrice:', lamborghini.getPrice()) ; console.log('lamborghini.getSpeed:', lamborghini.getSpeed()) ; console.log('宇通汽车子类--------------------------------------------------') ; console.log('yutong:', yutong) ; console.log('yutong.type:', yutong.type) ; console.log('yutong.tgetPrice:', yutong.getPrice()) ; console.log('yutong.getSpeed:', yutong.getSpeed()) ; // Error: 抽象方法不能调用 console.log('yutong.getPassengerNum:', yutong.getPassengerNum()) ; console.log('奔驰汽车子类--------------------------------------------------') ; console.log('benz:', benz) ; console.log('benz.type:', benz.type) ; console.log('benz.tgetPrice:', benz.getPrice()) ; console.log('benz.getSpeed:', benz.getSpeed()) ; // Error: 抽象方法不能调用 console.log('benz.getPassengerNum:', benz.getTrainLoad()) ; </script></body>
阅读全文
0 0
- 设计模式知识连载(15)---抽象工厂模式:
- 设计模式知识连载(13)---简单工厂模式:
- 设计模式知识连载(14)---工厂方法模式:
- java设计模式连载(2) --抽象工厂模式
- Java设计模式圣经连载(03)-抽象工厂模式
- Java设计模式圣经连载(03)-抽象工厂模式
- 设计模式(抽象工厂)
- 大话设计模式15----抽象工厂模式
- 设计模式(4)-抽象工厂模式
- 设计模式:抽象工厂模式(Python)
- 设计模式(JAVA)------抽象工厂模式
- 设计模式(三)---抽象工厂模式
- 抽象工厂模式---设计模式(好)
- 设计模式(3):抽象工厂模式
- 设计模式(三)--抽象工厂模式
- 设计模式(3):抽象工厂模式
- 设计模式------抽象工厂模式(AbstractFactoryPattern)
- 设计模式(二):抽象工厂模式
- Android ARM注释
- 原生js实现移动端触摸轮播
- 5.Spring自动装配
- tomcat7和tomcat8中文乱码问题
- 腾讯研究院&BOSS直聘:2017年全球人工智能人才白皮书
- 设计模式知识连载(15)---抽象工厂模式:
- 使用beanUtils操纵javabean
- Android面试知识点_
- 两部电梯的测试用例
- Linux netfilter
- 判断NSString里是否有中文
- 更新Mysql数据库的数据
- pxe网络安装操作系统 原理与详细过程
- 自己配置