java 23种设计模式之创建型—建造者模式(4)

建造者模式,首先我们想到的就是建筑工人,继而我们可以想到普通的店家老板,我们来看看建造者模式的定义吧:

建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

这句话听起来似乎很难理解,其实简单的说就是把一个问题分成几个部分来处理就行了,比如建造一座高楼大厦,是不是你从没想过怎么去建造,其实我也没有想过怎么创建,但是我知道,首先应该是打地基,然后就是框架,然后就是内部建筑,然后就是政体的刷新,可能这个步骤不对,我们这里姑且就这样认为吧。

对于我们来说,我们不必去关心他的每一个细节,我们只需要选一个好的团队去完成就可以了,最后得到我们想要的房子即可

比如我这里有一个例子,面包:

面包的材料 materials

面包所使用的机器 machine

制作面包的工艺水平 level

我的面包就由以上三部分组成,我们知道,每个人制作的面包都是不一样的。所以我们开始吧

1,抽象面包


public interface IBuilder {
	void materials();		//一个面包的原料
	void machine();			//制作面包的机器
	void level();			//制作这个面包的工艺水平
	
	Product getBread();		//返回一个面包
}
2,制作面包,每一个人制作的面包都是不一样的哦



public class BuilderAImpl implements IBuilder{
	Product product = new Product();
	@Override
	public void materials() {
		product.setMaterials("面包的材料是A");
		
	}

	@Override
	public void machine() {
		product.setMachine("制作面包的机器是A1");
		
	}

	@Override
	public void level() {
		product.setLevel("制作面包的工艺水平是A2");
		
	}

	//返回一个具体的产品
	@Override
	public Product getBread() {
		// TODO 自动生成的方法存根
		return product;
	}


}
3,一个完整的面包,给客户吃的哦



public class Product {
	private String materials;
    private String machine;
    private String level;
	public String getMaterials() {
		return materials;
	}
	public void setMaterials(String materials) {
		this.materials = materials;
	}
	public String getMachine() {
		return machine;
	}
	public void setMachine(String machine) {
		this.machine = machine;
	}
	public String getLevel() {
		return level;
	}
	public void setLevel(String level) {
		this.level = level;
	}
    
}
4,选择一个面包



public class Director {
	/**
     * 持有当前需要使用的建造器对象
     */
    private IBuilder builder;
    /**
     * 构造方法,传入建造器对象
     * @param builder 建造器对象
     */
    public Director(IBuilder builder){
        this.builder = builder;
    }
    /**
     * 产品构造方法,负责调用各个零件建造方法
     */
    public void construct(){
        builder.materials();
        builder.machine();
        builder.level();
    }
}
这样我们就完成了,


看看我们客户是如何吃到面包的吧


//获得一个产品
IBuilder builder = new BuilderAImpl();
//导演类指定需要什么产品
Director director = new Director(builder);
//构建产品
director.construct();

Product product = builder.getBread();


现在李阿姨在做面包,如果我们想吃张阿姨做的面包,我们仅仅只需要再写一个BuilderBImpl   最后由导演类指定需要张阿姨的面包i就可以了哦。

以上便是创建者模式!


当然创建者模式的另一个用途就是如果一个类里面有多个属性需要构造获得,而有些参数是必须的,有些参数是可选的。我们就可以使用创建者模式,当然,你也可以不使用建造者模式,但是我想告诉你,使用建造者模式,没错!我这里还是有一个例子,user类,接收的用户名和密码是必须的,而其他是可选的:

public class user {
	private final String username;
	private final String userpass;
	private final String usersex;
	private final int age;
	private final String phone;
	
	protected user(UserBuilder userbuilder){
		this.username = userbuilder.username;
		this.userpass = userbuilder.userpass;
		this.usersex = userbuilder.usersex;
		this.age = userbuilder.age;
		this.phone = userbuilder.phone;
	}
下面省略了属性的get方法,注意,不用添加set方法哦
。。。。。。
下面是UserBuilder类


public class UserBuilder{
	public String username;
	public String userpass;
	public String usersex;
	public int age;
	public String phone;
	
	public UserBuilder(){
		
	}
	
	//必须接收的参数
	public UserBuilder(String username,String userpass){
		this.username = username;
		this.userpass = userpass;
	}
	
//下面的是接收可选的参数         
public UserBuilder usersex(String usersex){
		this.usersex = usersex;
		return this;
	}
	public UserBuilder age(int age){
		this.age = age;
		return this;
	}
	public UserBuilder phone(String phone){
		this.phone = phone;
		return this;
	}
	
        //注意我们先创建了user对象,这样可以保证它是线程安全的
	public user build(){
		user u = new user(this);
		if(u.getAge()>120){
			throw new IllegalStateException("你不可能活到超过120岁吧");
		}
		return u;
	}
}


下面我们看看demo怎么写的

user u = null;
u = new UserBuilder("sasa","sdww").usersex("y").build();
看看吧,这样一目了然,用一行代码就完成了一个对象的创建。当然了我们仍然不用去关心他们是怎么完成的,我们只关心具体的参数即可(可以理解为制作面包阿姨的各种设备)。


综上所述,如果你的产品可能会有多个结果,但是其他的都是一样的,或者你的需要多个不确定的属性要构造,就可以使用建造者模式;


爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img