设计模式——建造者模式

今天来给大家分享以下建造者模式

什么是建造者模式呢,我不用太官方的语言给大家表示
首先建造就是指创建复杂对象,像如果一个类中有相当多的属性,且这些属性有些需要赋值,有些不需要,那么像我们之前可能会使用set方法进行设置,比如下面这样

我们的Person类,

public class Person {
    private String name;   //姓名
    private String age;	   //年龄	
    private String sex;    //性别
    private String height; //身高
    private String weight; //体重
	//省略了set方法和toString方法。
}

测试代码

public class Test {
       public static void main(String[] args) {
		 Person person =new Person();
		 person.setName("张三");
		 person.setAge("18");
		 person.setSex("男");
		 person.setHeight("185");
		 person.setWeight("140");

		 System.out.println(person);
	}
}

我们使用大段的set方法,阅读起来也有点不舒服,此时像这种属性很多且赋值情况很多的类,我们就可以使用建造者模式+链式写法+静态内部类来实现

改造Person类

public class Person {
    private String name;   //姓名
    private String age;	   //年龄	
    private String sex;    //性别
    private String height; //身高
    private String weight; //体重
    //省略了set和toString方法

	public static class Builder{
        //静态内部类Builder内部持有一个person对象,调用person的set方法
    	private Person person =new Person();
     
    	public Builder name(String name) {
    		person.setName(name);
    		return this;
    	}
    	
    	public Builder age(String age) {
    		person.setAge(age);
    		return this;
    	}
    	
    	public Builder sex(String sex) {
    		person.setSex(sex);
    		return this;
    	}
    	
    	public Builder height(String height) {
    		person.setHeight(height);
    		return this;
    	}
    	
    	public Builder weight(String weight) {
    		person.setWeight(weight);
    		return this;
    	}
    	//最后通过一个builder方法返回person对象
    	public Person builder() {
    		return person;
    	}
     
    }  
}

再看我们的测试代码

public class Test {
       public static void main(String[] args) {
		Person person=new Person.Builder()
				                .name("张三")
				      		    .age("18")
				      			.sex("男")
				      			.height("185")
				      			.weight("140")
				      			.builder();

		 System.out.println(person);
	}
}

虽然我们的Person类内部的代码增多了,但是换来的客户端调用的代码是简洁了许多,并且,这样的代码格式大家一定在自己的编程过程中也遇到过。比如在Mybatis用注解实现动态SQL的时候,需要创建一个类,类中写方法然后返回SQL语句,比如

		public String insertUserInfo(UserInfo ui) {
			 return new SQL() {
				 	{
						 INSERT_INTO("user_info");
						 if(ui.getUserName()!=null) {
							 VALUES("userName","#{userName}");
						 }
						 if(ui.getPassword()!=null) {
							 VALUES("password","#{password}");
						 }
				 	}
			 }.toString();
		}

还记得大三学习安卓的时候,里面一个AlertDialog对话框,其实这个类内部的也是建造者模式。

还记得我当初工厂那篇文章吗,我说工厂就是来创造东西的,咱们创造空调,而今天的建造者模式也是来创建东西的,那么他们的区别在哪里呢?以下是我个人的见解

虽然两者都是创造对象,
工厂注重创建结果,注重的是一个产品结果产出
建造者注重创建过程,注重的是这个产品创建过程中属性情况
就如空调的那个例子,从工厂的产品线上出来的空调都是格力空调,但是各个产品线的不同,就会创建不同的空调。

希望大家能从我的介绍中获得一定的收获,大家可以用我的代码复制回去运行一下,细细体会建造者模式在创建复杂对象过程中的优势,并能分辨出和工厂模式的区别

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值