建造者模式
一、基本介绍
- 建造者模式又名生成这模式,是一种对象构建模式。
- 建造者模式用于将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造不同表现(属性)得对象
- 建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
建造者模式中的4个角色:
-
Product(产品角色):一个具体的产品对象
-
Builder(抽象建造者):创建一个Product对象。约定规范构建和装配产品的各个部件(方法)
-
ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件(方法)
-
Director(指挥者):构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。
它主要的两个作用:
(1)隔离客户与对象的生成过程
(2)负责控制产品对象的生产过程
二、普通方式建造对象
1、介绍
优点:简单、好理解、容易操作
缺点:
该方式建造对象,过于简单,没有设计缓冲层对象,程序的扩展和维护不好。
这种设计方式将产品(饺子)和创建产品的过程(做饺子的过程)封装在一起,耦合性增强
而建造者模提供的解决方案就是将产品和产品建造过程解耦。
2、代码
/**
* 抽象饺子类
*/
public abstract class AbstractDumplings {
//擀面皮
public abstract void crust();
//添加馅料
public abstract void stuffing();
//煮饺子
public abstract void boil();
public void build(){
crust();
stuffing();
boil();
}
}
/**
* 牛肉饺子
*/
public class BeefDumplings extends AbstractDumplings{
@Override
public void crust() {
System.out.println("擀牛肉饺子面皮");
}
@Override
public void stuffing() {
System.out.println("包牛肉饺子");
}
@Override
public void boil() {
System.out.println("煮牛肉饺子");
}
}
/**
* 猪肉饺子
*/
public class PorkDumplings extends AbstractDumplings{
@Override
public void crust() {
System.out.println("擀猪肉饺子面皮");
}
@Override
public void stuffing() {
System.out.println("包猪肉饺子");
}
@Override
public void boil() {
System.out.println("煮猪肉饺子");
}
}
public class Test {
public static void main(String[] args) {
BeefDumplings beefDumplings = new BeefDumplings();
beefDumplings.build();
System.out.println("----------------------------");
PorkDumplings porkDumplings = new PorkDumplings();
porkDumplings.build();
}
}
三、建造者模式
1、介绍
Product(产品角色):Dumplings
Builder(抽象建造者):DumplingsBuilder
ConcreteBuilder(具体建造者):BeefDumplings、PorkDumplings
Director(指挥者):DumplingsDirector
2、UML
3、代码实现
/**
* 饺子
*/
public class Dumplings {
//面皮
private String crust;
//馅料
private String stuffing;
//煮
private String boil;
public String getCrust() {
return crust;
}
public void setCrust(String crust) {
this.crust = crust;
}
public String getStuffing() {
return stuffing;
}
public void setStuffing(String stuffing) {
this.stuffing = stuffing;
}
public String getBoil() {
return boil;
}
public void setBoil(String boil) {
this.boil = boil;
}
}
/**
* 饺子构建者
*/
public abstract class DumplingsBuilder {
Dumplings dumplings = new Dumplings();
//擀面皮
public abstract void crust();
//添加馅料
public abstract void stuffing();
//煮饺子
public abstract void boil();
public Dumplings build() {
return dumplings;
}
}
/**
* 牛肉饺子
*/
public class BeefDumplings extends DumplingsBuilder {
@Override
public void crust() {
System.out.println("擀牛肉饺子面皮");
}
@Override
public void stuffing() {
System.out.println("包牛肉饺子");
}
@Override
public void boil() {
System.out.println("煮牛肉饺子");
}
}
/**
* 猪肉饺子
*/
public class PorkDumplings extends DumplingsBuilder {
@Override
public void crust() {
System.out.println("擀猪肉饺子面皮");
}
@Override
public void stuffing() {
System.out.println("包猪肉饺子");
}
@Override
public void boil() {
System.out.println("煮猪肉饺子");
}
}
/**
* 饺子指挥者
*/
public class DumplingsDirector {
private DumplingsBuilder dumplingsBuilder = null;
public DumplingsDirector(DumplingsBuilder dumplingsBuilder){
this.dumplingsBuilder = dumplingsBuilder;
}
/**
* 获取饺子
* @return
*/
public Dumplings getDumplings() {
dumplingsBuilder.crust();
dumplingsBuilder.stuffing();
dumplingsBuilder.boil();
return dumplingsBuilder.build();
}
}
public class Test {
public static void main(String[] args) {
DumplingsDirector dumplingsDirector = new DumplingsDirector(new BeefDumplings());
dumplingsDirector.getDumplings();
System.out.println("----------------------------------------------------------");
DumplingsDirector dumplingsDirector2 = new DumplingsDirector(new PorkDumplings());
dumplingsDirector2.getDumplings();
}
}
or(new BeefDumplings());
dumplingsDirector.getDumplings();
System.out.println("----------------------------------------------------------");
DumplingsDirector dumplingsDirector2 = new DumplingsDirector(new PorkDumplings());
dumplingsDirector2.getDumplings();
}
}