zoukankan      html  css  js  c++  java
  • 移动架构之建造者模式

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

    建造者模式中的角色

    抽象建造者:给出一个抽象接口,定义了需要进行的工作,就像指导手册一样
    具体建造者:具体的建造者完成抽象方法,返回对象
    设计者(指导者):所有提出的需求在设计者这个类里面都能找得到
    产品:制造出来的产品

    使用场景

    • 需要生成的对象具有复杂的内部结构
    • 需要生成的对象内部属性本身相互依赖

    与工厂模式的区别:建造者模式更加关注与零件装配的顺序

    实例说明

    以建造一个房子为例
    抽象建造者

    public interface Build {
    	public void makeWindow();
    	public void makeFloor();
    	public Room getRoom();
    }
    

    具体建造者

    public class WorkBuilder  implements Build{
    
    	private Room room=new Room();
    
    	@Override
    	public void makeWindow() {
    		room.setFloor("地板");
    	}
    
    	@Override
    	public void makeFloor() {
    		room.setWindow("窗户");
    	}
    
    	@Override
    	public Room getRoom() {
    		return room;
    	}
    }
    

    设计者

    public class Designer {
    	
    	public void order(Build build) {
    		build.makeFloor();
    		build.makeWindow();
    	}
    }
    

    产品

    public class Room {
    
    	private String window;	
    	private String floor;
    
    	public String getWindow() {
    		return window;
    	}
    
    	public void setWindow(String window) {
    		this.window = window;
    	}
    
    	public String getFloor() {
    		return floor;
    	}
    
    	public void setFloor(String floor) {
    		this.floor = floor;
    	}
    
    	@Override
    	public String toString() {
    		return "floor: " + floor + ", window: " + window;
    	}
    }
    

    测试类

    public class Client {
    	public static void main(String[] args) {
    		Build worker = new WorkBuilder(); //获取工人对象
    		Designer designer = new  Designer(); //获取设计师对象
    		designer.order(worker); //设计师指挥工人工作
    		System.out.println(worker.getRoom()); //工人交房
    	}
    }
    

    建造者模式的常用方式

    在建造者模式中,在实际运用的时候往往会省略掉设计者这个角色
    其主要是考虑到不向外暴露太多实现细节
    使用链式构建,使得对外隐藏所有细节,这也是build采用的设计思想

    public class Room {
    
    	private String window;	
    	private String floor;
    
    	public void apply(WorkBuilder.RoomParmas parmas)
    	{
    		window=parmas.window;
    		floor=parmas.floor;
    	}
    
    	@Override
    	public String toString() {
    		return "floor: " + floor + ", window: " + window;
    	}
    }
    
    public class WorkBuilder{
    
    	private RoomParmas parmas;
    	
    	public WorkBuilder( ) {
    		this.parmas = new RoomParmas();
    	}
    
    	public  WorkBuilder makeWindow(String window ) {
    		parmas.window = window;
    		return this;
    	}
    
    	public WorkBuilder makeFloor(String floorCorlor) {
    		parmas.floor = floorCorlor;
    		return this;
    	}
    
    	public Room build() {
    		Room room = new Room();
    		room.apply(parmas);
    		return room;
    	}
    
    	class RoomParmas {
    		public String window;	
    		public String floor;
    	}
    }
    
    public class Client {
    	public static void main(String[] args) {    
    		Room room = (new WorkBuilder()).makeWindow("玻璃")
    						.makeFloor("地板").build();   
    		System.out.println(room);
    	}  
    }
    
  • 相关阅读:
    hdu-1862 EXCEL排序
    hdu-1754 I Hate It
    hdu-1538 A Puzzle for Pirates
    在Window下安装Linux (ubuntu-16.04.2)
    Python爬虫--简单的单词查询
    Linux下MySQL在知道密码的情况下修改密码
    Linux下忘记MySQL密码的解决方法和输入mysqld_safe --skip-grant-tables &后无法进入MySQL的解决方法
    Python的下载及安装
    在Netbeans的项目中添加JDBC驱动程序
    Mac下截屏方法
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664624.html
Copyright © 2011-2022 走看看