设计模式(四)建造者模式

定义:

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

结构:

建造者模式结构图

应用场景

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

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

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

举例

  • 有这么一个普通的House类,一般情况下我们会让客户直接new出一个对象,然后再通过set属性的方法进行造房子,但这样会把所有实现的细节全都暴露给客户,由客户对房子进行修饰,这样会有一个问题,有时候我们并不想让实现细节暴露出来,因此,就要引入了建造者模式。

      /*房子对象*/
      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;
      	}
      
      }
    
    
       //客户直接造房子
       House house = new House();
       house.setFloor("地板");
       house.setWall("墙");
       house.setHousetop("屋顶");
    
  • 使用建造者模式对对象进行装饰:

    • Concrete对象:抽象的工程队,可以完成一系列的操作。

        /* 工程队*/
        public interface HouseBuilder {
        	// 修地板
        	public void makeFloor();
        
        	// 修墙
        	public void makeWall();
        
        	// 修屋顶
        	public void makeHousetop();
        
        	// 获取对象
        	public House getHouse();
        }
      
    • Builder:

        /*公寓工程队*/
        public class GongyuBuilder implements HouseBuilder{
        	House house = new House();
        	
        	public House getHouse() {
        		return house;
        	}
        
        	public void makeFloor() {
        		house.setFloor("公寓-->地板");
        	}
        
        	public void makeHousetop() {
        		house.setHousetop("公寓-->房顶");
        	}
        
        	public void makeWall() {
        		house.setWall("公寓-->墙");
        	}
        	
        }
      
        /*平房工程队*/
        
        public class PingFangBuilder implements HouseBuilder {
        	House house = new House();
        
        	public void makeFloor() {
        		house.setFloor("平房-->地板");
        	}
        
        	public void makeHousetop() {
        		house.setHousetop("平房-->房顶");
        	}
        
        	public void makeWall() {
        		house.setWall("平房-->墙");
        	}
        
        	public House getHouse() {
        		return house;
        	}
        
        }
      
    • Director:设计者,对屋子进行构建。

        public class HouseDirector {
        
        	public void makeHouse(HouseBuilder builder) {
        		builder.makeFloor();
        		builder.makeWall();
        		builder.makeHousetop();
        	}
        
        }
      
    • MainClass:

        public class MainClass {
        
        	public static void main(String[] args) {
        
        		// 设计者来设计屋子
        		HouseDirector director = new HouseDirector();
        		// 由工程队来修
        		HouseBuilder builder = new PingFangBuilder();
        		// HouseBuilder builder = new GongyuBuilder();
        		director.makeHouse(builder);
        
        		House house = builder.getHouse();
        		System.out.println(house.getFloor());
        		System.out.println(house.getWall());
        		System.out.println(house.getHousetop());
        	}
        
        }
      

在Main方法中可以看到,在构建对象的时候,客户不需要对数据进行细节操作,只需要创建出工程队和设计者,设计者会将所有操作交给工程队来做,我们只需要一个想要实现的工程队即可,它会给我们创建出相应的对象。

原文地址:https://www.cnblogs.com/esileme/p/7566866.html