• 建造者模式


    周末研究了建造者模式准备写点东西出来,却有种话到嘴边,说不出来的感觉。然后今天上班看到写在黑板上的笔记突然有种醍醐灌顶的感觉,为什么呢?就是感觉 想通了关于设计模式几个最关键的问题?这种设计模式是为了解决什么问题?这个设计模式是怎么解决这个问题的?这个设计模式的特点是什么?也就是区别于其他设计模式的地方在哪里?这些问题都是研究设计模式核心

    建造者模式解决了什么问题?

    解决创建复杂且又多变的对象的问题。当需要创建的对象比较复杂且多变时,创建工作就变得比较艰难。这时候便需要建造者模式。

    我就以造房子为例,一步一步地将建造者模式融入到我们的代码当中。我们找到了一个专门造套房的团队,他们会打地基,会砌墙,会铺电线,会打孔,会铺砖...各种各样的技能。那么最原始的方法,就是我们拿到这个团队,然后按造房子的步骤走,例子如下(这是反面典型):

      public class Customer {
    	public static void main(String[] args) {
    		Builder builder = new Builder();   //此处的builder就是我们的建设团队
    		//打地基
    		builder.diji();
    		//铺砖
    		builder.puzhuan();
    		//铺电线
    		builder.pudianxian();
    		//上油漆
    		builder.youqi();
    		//拿到房子
    		Product product = builder.getProduct();
    	}
    }
    

    如果我们下次不造套房了,改成造别墅。那么就换一个造别墅的团队,再重复上面的步骤。那么问题来了,因为步骤很复杂,万一哪天弄糊涂了,在叫他们铺电线钱,就让他们把油漆上了...这种麻烦的事情每次都要自己去一步一步走下去,迟早是会出问题的。所以我们需要有一个专业的,绝对不会出错的人士来代替我们去指挥,这个就是建造者模式。

    建造者模式如何解决这个创建对象的问题?

    解决这种问题,首先还是要对应生活,在生活中找到工作的真谛,因为工作也仅仅是生活的一部分。

    假如我们现在在上海的世纪公园旁买了一套房子,为了住的更加舒适,肯定需要装修。这个房子价值千万,因此装修也必定是一个大工程。

    作为房主,我们现在应该怎么办?

    那我们一定会找一家专业装修且靠谱的大公司,为什么选择大公司?因为大公司比较规范,管理也比较严格(这也是建造者模式的优点)。到大公司找到一个经验丰富的团队leader.这个就是团队的指挥者。

    Leader必须包括两个要素1.一只素质过硬的团队 2.规范的作业流程

    装修流程

    选择好leader,下一步就是我们来挑选装修方案、装修风格,公司根据方案、风格挑选合适的施工队来进行施工。然后就开工了。

    第一步、找到一个指挥者 (找到一个大公司骨干人员Leader),该公司骨干精通装修的作业流程,知道怎么指挥:

    public class Director {                         //大公司
    	private Builder builder;                    //装修团队
    	public Director(Builder builder) {  
    		this.builder = builder;
    	}
    	public Product decorate() {                 //规范的作业流程
    		builder.diji();
    		//铺砖
    		builder.puzhuan();
    		//铺电线
    		builder.pudianxian();
    		//上油漆
    		builder.youqi();
    		
    		return builder.getProduct();
    	}
    }
    

    第二步:客户挑选装修风格,我选择欧美风,公司根据客户选择的风格安排欧美风装修施工团队。

    这个Builder类,也就是我们的施工队,可以有很多种,所以Builder是一个接口(装修规范),底下有各种实现类,至于Product类请自行脑补一个:

    public abstract class Builder {                    //装修团队
    	protected abstract void diji();
    	protected abstract void puzhuan();
    	protected abstract void pudianxian();
    	protected abstract void youqi();
    	 
    
    }
    
    public class ABuilder extends Builder{       //欧美风格施工队
    	private Product product;  //装修样板
    	@Override
    	protected void diji() {   //这些装修工人能够按照规范进行作业
    		product.diji();
    	}
    	@Override
    	protected void puzhuan() {
    		product.puzhuan();
    	}
    	@Override
    	protected void pudianxian() {
    		product.pudianxian();
    	}
    	@Override
    	protected void youqi() {
    		product.youqi();
    	}
    	protected Product getProduct() {
    		return product;
    	}
    }
    

    第三步:带领施工队到世纪公园的家里开始装修了!!!

    public class House {
    	public static void main(String[] args) {
    		Director director = new Director(new ABuilder());  //把欧洲风的装修意见给Leader
    		//安装装修规范进行装修。
    		Product EuropeanStyleHouse = director.decorate();
    	}
    }
    
  • 相关阅读:
    Git之将master合并到自己分支
    React 中的不可变数据 — Immer
    数据治理项目
    每日Excel系列
    Python实战网站开发:Day6编写配置文件
    Python实战网站开发:Day5搭建Web框架
    Python实战网站开发:Day7搭建MVC
    Visual Studio Code调试模式,出现无法打开,文件是目录错误的解决办法
    第1章 Vue.js2.0由浅入深:基本用法
    Python实战网站开发:Day4编写Model
  • 原文地址:https://www.cnblogs.com/gaoguofeng/p/9664197.html
Copyright © 2020-2023  润新知