Java学习-设计模式-建造者模式
概念
**建造者模式(Builder Pattern) ** 又名生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
**建造者模式 ** 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
**建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节. **
理解:
这玩意怎么说呢,
我们创建对象时,很多时候需要对对象里面的参数(属性)赋值,如果新建的对象属性很多,我们每次都需要重复的去给新建的对象赋值,这很麻烦,建造者模式就是新建一个类,将那个很多属性的类的属性值放在这个类中,每次新建一个对象,就使用这个新建的类去给新对象赋值,不用自己去set
属性值。
还比如说,我们新建一个对象,给这个对象属性赋值的时候存在一定的规则,为了避免在某一次新建对象的时候出错,我们可以把这个赋值时候的规则(或者说顺序、条件等)放到一个类中,然后在新建的对象的时候,调用这个类中的赋值方法给新对象赋值,只要新建的类没有问题,这样就一定不会出错。
举例:
创建一个 “女朋友”
package Practices.Mode.Builder_Pattern;
// 1. 首先需要创建一个“女朋友”类
// 定义其属性:比如姓名、年龄、身体、智商等等
// 为了说明建造者模式的作用,勉强定义这样一个规则:定义“女朋友”姓名、年龄和智商之前,先得让“女朋友出生”
public class GirlFriend {
private String body; // 身体属性
private String name; // 名字
private String age; // 年龄
private String IQ; // IQ
// 四个属性的get和set方法
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getIQ() {
return IQ;
}
public void setIQ(String IQ) {
this.IQ = IQ;
}
@Override
public String toString() {
return "GirlFriend{" +
"body='" + body + '\'' +
", name='" + name + '\'' +
", age='" + age + '\'' +
", IQ='" + IQ + '\'' +
'}';
}
}
package Practices.Mode.Builder_Pattern;
// 2. 创建一个建造“女朋友”的接口
// 在这个节口中,需要给“女朋友”的属性赋值,还要有一个创建女朋友的方法
// 为什么要定义一个这样的接口,我们创建对象的时候斌可能只创建一种类型,或者说只创建属性一致的对象。
public interface Builder_GirlFriend {
public void buildBody();
public void buildname();
public void buildBage();
public void buildIQ();
public GirlFriend CreateGirl();
}
package Practices.Mode.Builder_Pattern;
// 3. 创建一个类去实现之前的接口,这个类中决定一套GirlFriend的标准,可以再定义其他的实现类,然后在实现另一套标准
public class SmartGirlFriend implements Builder_GirlFriend {
public GirlFriend smartGirl;
public SmartGirlFriend(){
smartGirl = new GirlFriend();
}
public void buildBody() {
smartGirl.setBody("正常人的身材");
}
public void buildname() {
smartGirl.setName("小红");
}
public void buildBage() {
smartGirl.setAge("22");
}
public void buildIQ() {
smartGirl.setIQ("180");
}
public GirlFriend CreateGirl() {
return smartGirl;
}
}
package Practices.Mode.Builder_Pattern;
// 4, 重点来了,敲了好久,一定要写这句话
// 刚刚说了那么多,也可以创建一种对象了,但是这个Director 类就是我们决定创建时候规则的地方
public class Director {
// 这个创建方法的入参就是之前的接口,可以根据实现类的不同,从而实现创建不同属性的对象。
// 我觉得这里可以在创建多个方法,以实现不同的规则
public GirlFriend CreateGirlFriendByDirector(Builder_GirlFriend gf){
// 之前的规则:定义“女朋友”姓名、年龄和智商之前,先得让“女朋友出生”
// 所以我们先创建“她”的身体
gf.buildBody();
// 其次赋给“她”其他属性
gf.buildname();
gf.buildBage();
gf.buildIQ();
return gf.CreateGirl();
}
}
package Practices.Mode.Builder_Pattern;
//5. 测试
public class test_main {
public static void main(String[] args) {
Director director = new Director();
GirlFriend girlFriend = director.CreateGirlFriendByDirector(new SmartGirlFriend());
System.out.println(girlFriend.toString());
}
}