zoukankan      html  css  js  c++  java
  • 设计模式——建造者模式


    什么是建造者模式

    Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

    首先我们建立一个House对象

    package com.meritit;
    /**
     * 房子
     * @author 李小强
     *
     */
    public class House {
    	//地板
    	private String floor;
    	//墙
    	private String wall;
    	//屋顶
    	private String housetop;
    	
    	public String getFloor() {
    		return floor;
    	}
    	public void setFloor(String floor) {
    		this.floor = floor;
    	}
    	public String getWall() {
    		return wall;
    	}
    	public void setWall(String wall) {
    		this.wall = wall;
    	}
    	public String getHousetop() {
    		return housetop;
    	}
    	public void setHousetop(String housetop) {
    		this.housetop = housetop;
    	}
    	
    	
    }
    


     

    如果按照普通方法,我们去这样建造房子

    package com.meritit;
    /**
     * 
     * @author 李小强
     *
     */
    public class MainClass {
    	public static void main(String[] args) {
    		//客户直接造房子
    		House house = new House();
    		house.setFloor("地板");
    		house.setHousetop("屋顶");
    		house.setWall("墙");
    	}
    }
    


     

    上面的这种方式实际上是让客户自己造房子,这显然不好,下面我们开始用建造者模式实现:

    创建一个HouseBuilder接口

    package com.meritit;
    /**
     * 造房子的接口
     * @author 李小强
     *
     */
    public interface HouseBuilder {
    	//修地板
    	public void makeFloor();
    	//修墙
    	public void makeWall();
    	//修屋顶
    	public void makeHousetop();
    	//获得房子
    	public House getHouse();
    }
    


    用具体的造房子的工程实现

    package com.meritit;
    /**
     * 平房工程队
     * @author 李小强
     *
     */
    public class PingFangBuilder implements HouseBuilder{
    	House house = new House();
    
    	@Override
    	public void makeFloor() {
    		house.setFloor("平房地板");
    		
    	}
    
    	@Override
    	public void makeWall() {
    		house.setWall("平房房顶");
    	}
    
    	@Override
    	public void makeHousetop() {
    		house.setHousetop("平房屋顶");
    	}
    
    	@Override
    	public House getHouse() {
    		return house;
    	}
    
    }
    


    现在这样造房子

    package com.meritit;
    /**
     * 
     * @author 李小强
     *
     */
    public class MainClass {
    	public static void main(String[] args) {
    		//由工程队来修房子
    		HouseBuilder builder = new PingFangBuilder();
    		builder.makeFloor();
    		builder.makeHousetop();
    		builder.makeWall();
    		House house = builder.getHouse();
    		
    		System.out.println(house.getFloor());
    		System.out.println(house.getHousetop());
    		System.out.println(house.getWall());
    	}
    }
    

    这里好像缺少一个专门建造房子的角色,下面我们这样做:

    创建一个实际的建造者去造房子

    package com.meritit;
    /**
     * 实际建造者
     * @author 李小强
     *
     */
    public class HouseDicrector {
    	
    	private HouseBuilder builder;
    	
    	public HouseDicrector(HouseBuilder builder){
    		this.builder = builder;
    	}
    	
    	/**
    	 * 建造房子
    	 */
    	public void makeHouse(){
    		builder.makeFloor();
    		builder.makeHousetop();
    		builder.makeWall();
    	}
    }
    

    现在Main方法中就可以这样造房子了:


     

    package com.meritit;
    
    import javax.naming.directory.DirContext;
    
    /**
     * 
     * @author 李小强
     *
     */
    public class MainClass {
    	public static void main(String[] args) {
    		//设计房子
    		HouseBuilder builder = new PingFangBuilder();
    		//创造工程队
    		HouseDicrector dicrector = new HouseDicrector(builder);
    		//开始造
    		dicrector.makeHouse();
    		//得到房子
    		House house = builder.getHouse();
    		
    		System.out.println(house.getFloor());
    		System.out.println(house.getHousetop());
    		System.out.println(house.getWall());
    	}
    }
    


      这就是建造者设计模式,如果现在你想建造公寓只需要先设计一个公寓就行。

    设计公寓

    package com.meritit;
    /**
     * 设计公寓
     * @author 李小强
     *
     */
    public class GongyuBuilder implements HouseBuilder{
    	House house = new House();
    	@Override
    	public void makeFloor() {
    		 house.setFloor("公寓地板");
    	}
    
    	@Override
    	public void makeWall() {
    		house.setWall("公寓墙");
    	}
    
    	@Override
    	public void makeHousetop() {
    		house.setHousetop("公寓房顶");
    	}
    
    	@Override
    	public House getHouse() {
    		return house;
    	}
    
    }
    


    在Main方法中只需将Pingfang平房改为Gongyu

    package com.meritit;
    
    import javax.naming.directory.DirContext;
    
    /**
     * 
     * @author 李小强
     *
     */
    public class MainClass {
    	public static void main(String[] args) {
    		//设计房子
    		HouseBuilder builder = new GongyuBuilder();
    		//创造工程队
    		HouseDicrector dicrector = new HouseDicrector(builder);
    		//开始造
    		dicrector.makeHouse();
    		//得到房子
    		House house = builder.getHouse();
    		
    		
    		System.out.println(house.getFloor());
    		System.out.println(house.getHousetop());
    		System.out.println(house.getWall());
    	}
    }
    

    我们还可以再改一下

    package com.meritit;
    /**
     * 实际建造者
     * @author 李小强
     *
     */
    public class HouseDicrector {
    	/**
    	 * 建造房子
    	 */
    	public void makeHouse(HouseBuilder builder){
    		builder.makeFloor();
    		builder.makeHousetop();
    		builder.makeWall();
    	}
    }
    


     

    这样在Main方法中可以这样做:

    package com.meritit;
    
    import javax.naming.directory.DirContext;
    
    /**
     * 
     * @author 李小强
     *
     */
    public class MainClass {
    	public static void main(String[] args) {
    		//设计房子
    		HouseBuilder builder = new GongyuBuilder();
    		//创造工程队
    		HouseDicrector dicrector = new HouseDicrector();
    		//开始造
    		dicrector.makeHouse(builder);
    		//得到房子
    		House house = builder.getHouse();
    		
    		
    		System.out.println(house.getFloor());
    		System.out.println(house.getHousetop());
    		System.out.println(house.getWall());
    	}
    }
    


     

    建造者模式的结构如图:

     

    建造者模式的应用场景:

    -对象的创建:Builder模式是为对象的创建而设计的模式

    - 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象

    - 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法

    源代码下载:http://download.csdn.net/detail/lxq_xsyu/5956163

  • 相关阅读:
    [HNOI 2017]影魔
    [HNOI 2016]树
    [HNOI 2011]卡农
    [SCOI 2016]美味
    [SDOI 2011]染色
    [HNOI 2016]最小公倍数
    eclipse实现热部署和热加载
    mysql中时间比较的实现
    如何把本地项目部署到服务器上
    Linux部署项目和常用命令
  • 原文地址:https://www.cnblogs.com/pangblog/p/3263216.html
Copyright © 2011-2022 走看看