JS设计模式之--建造者模式

1、建造者模式(Builder)的定义

建造者模式是相对比较简单的一种设计模式,属于建立型模式的一种;定义:将一个复杂的对象分解成多个简单的对象来进行构建,将复杂的构建层与表现层分离,使相同的构建过程能够建立不一样的表示模式。html

简单例子来讲:当咱们在外面饭店吃饭时,好比点个水煮肉片,这家店可能会辣一点、那家店可能会咸一点、对面那家可能放青菜、隔壁那家可能放菠菜,每家店作出来的都不同,明明都是水煮肉片却有不一样的作法,若是都同样就不会说这家难吃那家好吃了。那再看KFC,咱们点个汉堡,全部人无论在哪一个城市哪家店,作法、味道都是同样的,为何呢,由于它用料、时间、温度等等都是严格规定的,咱们只须要下订单就好了,这就是一个建造者模式。ajax

2、模式的结构

建造者模式的主要角色以下:设计模式

  1. 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来建立其各个零部件。
  2. 抽象建造者(Builder):它是一个包含建立产品各个子部件的抽象方法的接口,一般还包含一个返回复杂产品的方法 getResult()。
  3. 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体建立方法。
  4. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的建立,在指挥者中不涉及具体产品的信息。

建造者模式结构图以下:markdown

3、模式的实现

1. 建造者模式咱们在代码中常常用到,好比Jquery中的ajax请求:ui

//1 用户发送一个请求
//2 $.ajax建造者模式(指挥者) 
//3 具体实现 (建造者)  
$.ajax({
    url:'www.juejin.cn',    
    success:function(argument){    }  
});
复制代码

2.其中主要流程实现:this

<!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8" />
            <title></title>    
        </head>    
<body>    
</body>    
<script>        
    //商店:Director指挥者类        
    function KFCShop() {
        this.construct = function(builder) {   
            builder.step1();                
            builder.step2();                
            return builder.get();            
    }}        
    //汉堡包制做:建造者类        
    function HamburgerBuilder() {            
        this.bread = null;            
        this.step1 = function() {              
            this.bread = new Hamburger();            
        };            
        this.step2 = function() {              
            this.bread.addQuantity();            
        };            
        this.get = function() {                
            return this.bread;            
        };        
    }        
    //薯条制做:建造者类        
    function FrenchFriesBuilder() {            
        this.fries = null;            
        this.step1 = function() {              
            this.fries = new FrenchFries();            
        };              
        this.step2 = function() {              
            this.fries.addQuantity();            
        };              
        this.get = function() {                
            return this.fries;            
        };        
    }                
    //产品类:汉堡包        
    function Hamburger() {            
        this.quantity = 1;              
        this.addQuantity = function() {              
            this.quantity = 6;              
        };             
        this.say = function() {                
            log.add("我要" + this.quantity + "个汉堡包!");            
        };        
    }        
    //产品类:薯条        
    function FrenchFries() {          
        this.quantity = 1;          
        this.addQuantity = function() {            
            this.quantity = 2;            
        };           
        this.say = function() {              
            log.add("我要" + this.quantity + "份薯条!");          
        };        
    }        
    // 日志打印        
    var log = (function() {            
        var log = "";            
        return {                
            add: function(msg) {                    
                log += msg + "\n";                
            },                
            show: function() {                    
                alert(log);                    
                log = "";                
            }            
        }        
     })();                
    //运行程序        
    function run() {          
        var shop = new KFCShop();          
        var hamBuilder = new HamburgerBuilder();          
        var friesBuilder = new FrenchFriesBuilder();          
        //顾客经过向商店下订不一样的饮食套餐,获得不一样的美食          
        var hamburgerOrder = shop.construct(hamBuilder);          
        var friesOrder = shop.construct(friesBuilder);          
        hamburgerOrder.say();          
        friesOrder.say();          
        log.show();        
     }        
     run();    
</script>
</html>
复制代码

3、模式的应用url

  1. 使用场景
  • 须要生成的对象具备复杂的内部结构时。
  • 相同的方法,不一样的执行顺序,产生不一样的结果。
  • 多个部件或零件,均可以装配到一个对象中,可是产生的结果又不相同。

   2.优势    spa

  • 封装性。是客户端没必要知道产品内部组成的细节。
  • 建造者独立,易扩展。
  • 便于控制细节风险。能够对建造过程逐步细化,而不对其余模块产生任何影响。

   3.缺点设计

  • 产品必须有共同点,范围有限制。
  • 若是内部变化复杂,会有不少建造类。
相关文章
相关标签/搜索