常用设计模式(02)建造者模式
Posted 林枍
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用设计模式(02)建造者模式相关的知识,希望对你有一定的参考价值。
建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
小洪的故事
今日出演:小洪、强哥
这一天刚放学,小洪已经饿到感觉自己已经饿到如鸿毛一样轻,快飘起来了(实际上小洪比泰山还重)。这时候强哥从身后走来,拍了拍小洪的肩膀:“老弟,听说学校门口新开了一家韩国自助烤肉,走!哥请你去吃。”
小洪眼珠子一转:“天下没有免费的午餐啊,老哥你就直说我干嘛吧。”
“哎,你想多了,我只是想今天去试试好不好吃,明天带女朋友去好点菜!”说罢强哥就搂着小洪的肩膀向门外走去,留下小洪的满脸黑线。
自助餐中的建造者
“老板,再来一盘羊肉。“小洪耳朵里听见强哥吆喝着,眼睛却离不开烤炉上滋滋冒油的肉片:“强哥,我等不及了,可以开动了吗?”
“别急别急。烤肉切忌心急”,强哥说:“我们要构建好这一块肉,这样更好吃!你看看这一块肉。”
肉类
public class Meet {
// 油
String oil;
// 调料1,2,3
String condiment1;
String condiment2;
String condiment3;
// 肉的类型
String MeetType;
// 肉的成熟度
int degree;
@Override
public String toString() {
return "一块" +
"油是'" + oil + '\'' +
", 调料1为'" + condiment1 + '\'' +
", 调料2为'" + condiment2 + '\'' +
", 调料3为'" + condiment3 + '\'' +
", " + degree + "分熟的" +
MeetType;
}
// 构造方法私有化,防止客户端直接调用构造方法
private Meet(String oil, String condiment1, String condiment2, String condiment3, String meetType, int degree) {
this.oil = oil;
this.condiment1 = condiment1;
this.condiment2 = condiment2;
this.condiment3 = condiment3;
MeetType = meetType;
this.degree = degree;
}
}
“强哥,全天下的肉不都是这样的么,不赶快吃饿死了。”小洪感到不解。
“别急,今天这个肉中,还有一个建造者内部类,负责建造这一块肉。”
建造者内部类
// 在Meet类中的静态方法,调用生成肉类
public static MeetBuilder builder(){
return new MeetBuilder();
}
//
public static class MeetBuilder{
String oil;
String condiment1;
String condiment2;
String condiment3;
String MeetType;
int degree;
public MeetBuilder oil(String oil){
this.oil = oil;
return this;
}
public MeetBuilder condiment1(String condiment1){
this.condiment1 = condiment1;
return this;
}
public MeetBuilder condiment2(String condiment2){
this.condiment2 = condiment2;
return this;
}
public MeetBuilder condiment3(String condiment3){
this.condiment3 = condiment3;
return this;
}
public MeetBuilder MeetType(String meetType){
this.MeetType = meetType;
return this;
}
public MeetBuilder degree(int degree){
this.degree = degree;
return this;
}
public Meet build(){
return new Meet(oil, condiment1, condiment2, condiment3, MeetType, degree);
}
}
强哥给小洪讲述了构建者类之后,趁着小洪还在懵逼中,马上叫到:“老板,你们这的招牌有什么?”
老板闻声赶来,并介绍到:”我们这里的黑椒胡椒牛排不错,客官你们想要几成熟的啊?“
“七成熟吧。”
“好嘞!”老板马上在我们面前动手做了起来。
客户端调用
public class People {
public static void main(String[] args) {
Meet meet = Meet.builder()
.oil("植物油")
.MeetType("牛肉")
.condiment1("香菜")
.condiment2("胡椒粉")
.condiment3("黑椒酱")
.degree(7)
.build();
System.out.println(meet);
}
}
“你瞧,这个招牌合不合你胃口呀?”强哥笑着问小洪。
“可,太可了!”小洪看着手法熟练的老板,哦不是老板手中的肉,说。
运行结果
一块油是'植物油', 调料1为'香菜', 调料2为'胡椒粉', 调料3为'黑椒酱', 7分熟的牛肉
“哇,真的太好吃了!”小洪满意地擦擦嘴,“这个建造器也太好用了吧!省去了很多功夫。”
“其实我们也可以不用建造器,直接手动建造这么一块肉呢!”强哥跃跃欲试。
“怎么做?”小洪用求知和崇拜的目光看着强哥。
“只需要将 Meet 的 set 方法都加上 return this 就可以啦!”强哥说,“接着就像下面一样调用。许多人都是这么用的,只不过还是推荐用建造者方法,毕竟老板比我们都熟练一些。”
Meet meet = new Meet()
.oil("")
.MeetType("")
.condiment1("")
.condiment2("")
.condiment3("")
.degree(10);
System.out.println(meet);
“可能我比较重口味,我想自己做一块芝士、酱油、芥末、六分熟的鸡排,老弟你不要介意。”
“强哥怎么这么说,咱们就不用客气,我就自己做一块用牛油、调料用番茄酱、沙拉酱和大蒜的五分熟羊排好了。”小洪说着自己准备动手。
“五分熟羊排和大蒜,英雄所见略同啊!”有道是酒逢知己千杯少,一顿羊排少不了。
男生的快乐往往就是这么简单、朴实无华。可强哥的女朋友可就未必能体会到了。
以上是关于常用设计模式(02)建造者模式的主要内容,如果未能解决你的问题,请参考以下文章