Java设计模式|建造者模式Builder Pattern
前言:
在日常生活中,我们可能会遇到这一类型的需求,例如一个实体类里有很多个属性,但是我们只想要其中的几种组合成一个新的对象,这个时候就可以使用建造者模式了,它提供了一种创建对象的最佳方式。建造者模式虽然比较好用,但是大家平时写代码的时候要谨记,不要滥用设计模式,不然的话可能会适得其反啊!
建造者模式
介绍:建造者模式又被称呼为生成器模式,这种类型的设计模式属于创建型模式,使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
作用: 建造者模式主要用于解决软件系统中复杂对象的创建问题。例如复杂对象的创建通过各个部分的子对象用一定的算法构成,在需求变化时复杂对象面临大的改变,不利于系统的稳定,使用建造者将各个部分的算法包装起来,需求变化只需要将算法的顺序以及组合方式改变即可。
解释: 我们可以这样理解一下:有一个特别好的例子,例如我们在麦当劳点餐有如下几个可点的东西
- 香辣鸡腿堡,奥尔良鸡腿堡,安格斯牛堡
- 可乐,橙汁,咖啡
- 薯条,鸡块,鸡腿
- 香辣鸡腿堡+可乐+薯条 =A套餐
- 奥尔良鸡腿堡+可乐+薯条 =B套餐
- 安格斯牛堡+可乐+薯条 =C套餐
- …
看上边的条件,我们在转换成Java代码进行编码的时候得写3 * 3 * 3=27个实体类来进行表示每一个实体类,这就很不友好了,这个时候就可以使用建造者模式来优化上面的这种情况;
代码实现:
第一步:定义Product
/**
* 一个具体的产品对象,实体
*/
public class Meal {
private String food;
private String drink;
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
public String getDrink() {
return drink;
}
public void setDrink(String drink) {
this.drink = drink;
}
}
复制代码
第二步:定义Builder(抽象建造者): 创建一个Product对象的各个部件指定的抽象接口
/**
* 抽象建造者
*/
public abstract class MealBuilder {
Meal meal = new Meal();
public abstract void buildFood();
public abstract void buildDrink();
public Meal getMeal(){
return meal;
}
}
复制代码
第三步,定义ConcreteBuilder(具体建造者): 实现抽象接口,构建和装配各个部件。
/**
* 具体建造者:A套餐
*/
public class MealA extends MealBuilder{
public void buildDrink() {
meal.setDrink("可乐");
}
public void buildFood() {
meal.setFood("薯条");
}
}
/**
* 具体建造者:B套餐
*/
public class MealB extends MealBuilder{
public void buildDrink() {
meal.setDrink("柠檬果汁");
}
public void buildFood() {
meal.setFood("鸡翅");
}
}
复制代码
第四步,定义Director(指挥者): 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
/**
* 指挥者:构建一个使用Builder接口的对象
*/
public class KFCServer {
private MealBuilder mealBuilder;
public KFCServer(MealBuilder mealBuilder) { //构造方法
this.mealBuilder = mealBuilder;
}
public Meal construct(){
//准备食物
mealBuilder.buildFood();
//准备饮料
mealBuilder.buildDrink();
//准备完毕,返回一个完整的套餐给客户
return mealBuilder.getMeal();
}
}
复制代码
第五步,测试
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
MealA a = new MealA();//创建套餐A对象
KFCServer waitera = new KFCServer(a);//准备套餐A的服务员
Meal mealA = waitera.construct();//获得套餐A
System.out.print("套餐A的组成部分:");
System.out.println("食物:"+mealA.getFood()+"; "+"饮品:"+mealA.getDrink());
MealB b = new MealB();
KFCServer waiterb = new KFCServer(b);
Meal mealB = waiterb.construct();
System.out.print("套餐B的组成部分:");
System.out.println("食物:"+mealB.getFood()+"; "+"饮品:"+mealB.getDrink());
}
}
复制代码
ok!今天的文章就到这了,希望可以对大家有帮助,有不对的地方希望大家可以提出来的,共同成长;
整洁成就卓越代码,细节之中只有天地
最后:
我想,可能还有很多人在今年刚过去的金三银四春招中保持着观望的形势,害怕自己的能力不够,或者是安于现状,觉得目前拿着几千的月薪觉得能够接受,那么你就要注意了,这是非常危险的!
我们身为技术人员,最怕的就是安于现状,一直在原地踏步,那么你可能在30岁就会迎来自己的职业危机,因为你工作这么久提升的只有自己的年龄,技术还是万年不变!
如果你想在未来能够自我突破,圆梦大厂,那或许以上这份Java学习资料,你需要阅读阅读,希望能够对你的职业发展有所帮助。
获取方式: 只需你**点赞+关注**后,加入Java架构资源交流群,找管理员获取哦-!
这份Java学习资料,你需要阅读阅读,希望能够对你的职业发展有所帮助。
获取方式: 只需你**点赞+关注**后,加入Java架构资源交流群,找管理员获取哦-!