0.前言
本案例没有任何物化女性朋友的意味,且没有任何挑拨男女之间关系的意思,仅在本专业的男生画饼充饥。
1.构造者设计模式思维模型分析
1.1构造者设计模式原理
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。
1.2案例分析
VR虚拟女友是现在热门的一个互动程序,VR女友的设计是一个复杂的过程,它包含女朋友的性格特点,三观等。用户把自己的女友需求告诉软件设计师,软件设计师再写出对应的程序进行实现。
这里的虚拟女友是产品,包含年龄、身高、性格等特点,具体的程序类实现是建造者,根据不同用户的需求进行指定不同的建造者,比如温柔型,暴躁型等。程序代码负责实现具体的实现。
软件设计师是指指挥者,他负责指挥不同的程序实现类进行实现。
1.3用到的设计原则
VR虚拟女友是现在热门的一个互动程序,VR女友的设计是一个复杂的过程,它包含女朋友的性格特点,三观等。用户把自己的女友需求告诉软件设计师,软件设计师再写出对应的程序进行实现。
这里的虚拟女友是产品,包含年龄、身高、性格等特点,具体的程序类实现是建造者,根据不同用户的需求进行指定不同的建造者,比如温柔型,暴躁型等。程序代码负责实现具体的实现。
软件设计师是指指挥者,他负责指挥不同的程序实现类进行实现。
1.4用到的OOP思想
>多态:抽象建造者定义了建造步骤,具体实现由不同的子类(具体建造者)实现。不同实现类得到不同结果。
继承、实现:具体建造者继承了抽象建造者GirlFriendBuilder类,并实现了其中规定的步骤。
依赖:具体构建者负责构建产品实例
聚合:GirlFriendDirector中存在Builder属性(包容关系)
2.情景假设
利用建造者模式描述程序如何创建一个VR虚拟女友:
它一般包含女朋友的性格、身高、身材、体重等组成部分,不同的女朋友有不同的组成部分,而虚拟女友的软件设计师(程序员)可以根据用户的要求,一步一步装配这些组成部分,构造一个完美的女朋友,然后返回给用户。
2.1UML描述视图
2.2代码实现——GirlFriend类
/**
* 女朋友类,表示被构建的复杂对象
* @author DELL
*
*/
public class GirlFriend {
private int age;//年龄
private int height;//身高
private String character;//性格
private String faceType;//脸型
private String WaistType;//腰型
private int weight;//体重
public void setAge(int age) {
this.age = age;
}
public void setHeight(int height) {
this.height = height;
}
public void setCharacter(String character) {
this.character = character;
}
public void setFaceType(String faceType) {
this.faceType = faceType;
}
public void setWaistType(String waistType) {
WaistType = waistType;
}
public void setWeight(int weight) {
this.weight = weight;
}
public GirlFriend() {
// TODO 自动生成的构造函数存根
}
public void showGirlInfo() {
System.out.println(" 女孩信息");
System.out.println("==============================");
System.out.println("女孩类型:"+character);
System.out.println("年龄:"+age);
System.out.println("身高:"+height);
System.out.println("脸型:"+faceType);
System.out.println("腰型:"+WaistType);
System.out.println("体重:"+weight+"kg");
System.out.println("==============================");
System.out.println();
System.out.println();
}
}
2.3代码实现——GirlFriendBuilder抽象建造者类
/**
* 抽象女朋友建造者类
* @author DELL
*
*/
public abstract class GirlFriendBuilder {
protected GirlFriend girlFriend = new GirlFriend ();
public abstract void buildAge(); // 设置年龄
public abstract void buildHeight(); // 设置身高
public abstract void buildCharacter(); // 设置性格
public abstract void buildFaceType();// 设置脸型
public abstract void buildWaistType();// 设置腰型
public abstract void buildWeight();// 设置体重
public abstract GirlFriend GetGirlFriend(); // 获得女朋友
}
2.4代码实现——具体建造者类(温柔型、暴躁型)
/**
* 具体建造者温柔型女朋友
* @author DELL
*
*/
public class GentleGirlFriend extends GirlFriendBuilder{
@Override
public void buildAge() {
girlFriend.setAge(20);
}
@Override
public void buildHeight() {
// TODO 自动生成的方法存根
girlFriend.setHeight(175);
}
@Override
public void buildCharacter() {
// TODO 自动生成的方法存根
girlFriend.setCharacter("温荣型");
}
@Override
public void buildFaceType() {
// TODO 自动生成的方法存根
girlFriend.setFaceType("瓜子脸");
}
@Override
public void buildWaistType() {
// TODO 自动生成的方法存根
girlFriend.setWaistType("水蛇腰");
}
@Override
public void buildWeight() {
// TODO 自动生成的方法存根
girlFriend.setWeight(50);
}
@Override
public GirlFriend GetGirlFriend() {
// TODO 自动生成的方法存根
return this.girlFriend;
}
}
/**
* 具体建造者暴躁易怒型女朋友
* @author DELL
*
*/
public class TermagancyGirlFriend extends GirlFriendBuilder{
@Override
public void buildAge() {
// TODO 自动生成的方法存根
girlFriend.setAge(20);
}
@Override
public void buildHeight() {
// TODO 自动生成的方法存根
girlFriend.setHeight(165);
}
@Override
public void buildCharacter() {
// TODO 自动生成的方法存根
girlFriend.setCharacter("暴躁易怒型");
}
@Override
public void buildFaceType() {
// TODO 自动生成的方法存根
girlFriend.setFaceType("鹅蛋脸");
}
@Override
public void buildWaistType() {
// TODO 自动生成的方法存根
girlFriend.setWaistType("人鱼腰");
}
@Override
public void buildWeight() {
// TODO 自动生成的方法存根
girlFriend.setWeight(50);
}
@Override
public GirlFriend GetGirlFriend() {
// TODO 自动生成的方法存根
return this.girlFriend;
}
}
2.5代码实现——GirlFriendDirector指导者类
/**
* 女朋友指导者类
* @author DELL
*
*/
public class GirlFriendDirector {
// 女朋友建造者
private GirlFriendBuilder builder;
public GirlFriendDirector(GirlFriendBuilder builder)
{
this.builder = builder;
}
// 女朋友建造过程
public void Construct()
{
builder.buildAge();
builder.buildCharacter();
builder.buildFaceType();
builder.buildHeight();
builder.buildWaistType();
builder.buildWeight();
}
public void GirlFriendConstruct(GirlFriendBuilder girlFriendBuilder){
girlFriendBuilder.buildAge();
girlFriendBuilder.buildCharacter();
girlFriendBuilder.buildFaceType();
girlFriendBuilder.buildHeight();
girlFriendBuilder.buildWaistType();
girlFriendBuilder.buildWeight();
}
}
2.6代码实现——GirlFriendProduct类
public class GirlFriendProduct {
public static void main(String[] args) {
//新建一个温柔型女朋友
GentleGirlFriend gentleGirlFriend =new GentleGirlFriend();
GirlFriendDirector gentleGirlFriendDirector=new GirlFriendDirector(gentleGirlFriend);
gentleGirlFriendDirector.Construct();
gentleGirlFriend.GetGirlFriend().showGirlInfo();//获取女朋友信息
//新建一个暴躁易怒型女朋友
TermagancyGirlFriend termagancyGirlFriend =new TermagancyGirlFriend();
GirlFriendDirector termagancyGirlFriendDirector=new GirlFriendDirector(termagancyGirlFriend);//指挥者调用进行组装暴躁易怒型型女朋友
termagancyGirlFriendDirector.Construct();
termagancyGirlFriend.GetGirlFriend().showGirlInfo();//获取女朋友信息
}
}
运行结果:
女孩信息
==============================
女孩类型:温荣型
年龄:20
身高:175
脸型:瓜子脸
腰型:水蛇腰
体重:50kg
==============================
女孩信息
==============================
女孩类型:暴躁易怒型
年龄:20
身高:165
脸型:鹅蛋脸
腰型:人鱼腰
体重:50kg
==============================
3.建造者模式在Java中的简化
构建过程:生产一个GirlFriend类,调用其中的静态类Builder中的Set方法,在这些方法中,每次都返回这个静态类自己,因此可以继续调用.set方法,直到调用.build方法时,将这个内部类中最终构建好的对象返回给外部类的构造方法,完成对象的创建。
使用场景:当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用建造者模式。
使用静态内部类的方式,省去了指挥者,因为指挥者就是我们自己。这样可以使用链式调用构建对象,使用更灵活。
代码如下:
/**
* 使用静态内部类来简化构造者模式
* @author DELL
*
*/
public class GirlFriend {
private final int age;//年龄
private final int height;//身高
private final String character;//性格
private final String faceType;//脸型
private final String WaistType;//腰型
private final int weight;//体重
public String showGirlInfo() {
return " 女孩信息"+
"\n"+"=============================="+
"\n"+"女孩类型:" + character + "\n"+
"年龄:" + age + "\n"+
"身高:" + height + "\n"+
"脸型:" + faceType + "\n"+
"腰型:" + WaistType + "\n"+
"体重:" + weight + "\n"+
"=============================="+"\n"+"\n"+"\n"
;
}
public GirlFriend(GirlFriendBuilder gfBuilder) {
this.age=gfBuilder.age;
this.character=gfBuilder.character;
this.faceType=gfBuilder.faceType;
this.height=gfBuilder.height;
this.WaistType=gfBuilder.WaistType;
this.weight=gfBuilder.weight;
}
public static class GirlFriendBuilder{
private int age;//年龄
private int height;//身高
private String character;//性格
private String faceType;//脸型
private String WaistType;//腰型
private int weight;//体重
//年龄、性格、脸型、腰型为必选
public GirlFriendBuilder(int age,String character, String faceType,
String waistType) {
super();
this.age=age;
this.character = character;
this.faceType = faceType;
this.WaistType = waistType;
}
public GirlFriendBuilder() {
super();
}
public GirlFriendBuilder setAge(int age) {
this.age = age;
return this;
}
public GirlFriendBuilder setHeight(int height) {
this.height = height;
return this;
}
public GirlFriendBuilder setCharacter(String character) {
this.character = character;
return this;
}
public GirlFriendBuilder setFaceType(String faceType) {
this.faceType = faceType;
return this;
}
public GirlFriendBuilder setWaistType(String waistType) {
WaistType = waistType;
return this;
}
public GirlFriendBuilder setWeight(int weight) {
this.weight = weight;
return this;
}
public GirlFriend build(){
return new GirlFriend(this);
}
}
public int getAge() {
return age;
}
public int getHeight() {
return height;
}
public String getCharacter() {
return character;
}
public String getFaceType() {
return faceType;
}
public String getWaistType() {
return WaistType;
}
public int getWeight() {
return weight;
}
}
测试类:
public class GirlFriendTest {
public static void main(String[] args) {
GirlFriend gf=new GirlFriend.GirlFriendBuilder()
.setAge(20)
.setCharacter("刘亦菲类型")
.setFaceType("瓜子脸")
.setHeight(170)
.setWaistType("水蛇腰——超级无敌宇宙至尊ULTRA_PLUS_PRO_edition")
.setWeight(50)
.build();
System.out.println(gf.showGirlInfo());
}
}
运行结果:
女孩信息
==============================
女孩类型:刘亦菲类型
年龄:20
身高:170
脸型:瓜子脸
腰型:水蛇腰——超级无敌宇宙至尊ULTRA_PLUS_PRO_edition
体重:50
==============================
4.总结
4.1案例总结
在这次的建造者模式案例中,在抽象建造者类GirlFriendBuilder中确立了组装标准,具体的组装女朋友的技术和实现则交给多个不一样具体女朋友实现建造者去实现。
指导者则负责接收用户的需求,和把控组装的工序。这样就实现了“变”与“不变”分开、“工序标准化”,实现了通过相同的构建过程生产出不同的产品,也就达成了建造者模式的目标。
4.2建造者模式使用总结
使用场景:
1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。
优点:
1、建造者独立,易扩展。
2、便于控制细节风险。
缺点:
1、产品必须有共同点,范围有限制。
2、如内部变化复杂,会有很多的建造类。