zoukankan      html  css  js  c++  java
  • 抽象类工厂模式

    <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>
  • 相关阅读:
    主席树学习笔记(静态区间第k大)
    p1156 题解(未完全解决)
    树上神奇 逆 逆序对(我的叫法)hh的小纸条 重中之重!!!!!
    二叉查找树学习笔记(BST)
    负环...坑点
    差分约束系统学习笔记
    tarjan学习(复习)笔记(持续更新)(各类找环模板)
    分层图食用简介
    js数组方法
    灵动标签调用父栏目下的所有文章
  • 原文地址:https://www.cnblogs.com/jokes/p/9706713.html
Copyright © 2011-2022 走看看