建造者模式

一、基本介绍

  1. 建造者模式又名生成这模式,是一种对象构建模式。
  2. 建造者模式用于将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造不同表现(属性)得对象
  3. 建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

    建造者模式中的4个角色:

  4. Product(产品角色):一个具体的产品对象

  5. Builder(抽象建造者):创建一个Product对象。约定规范构建和装配产品的各个部件(方法)

  6. ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件(方法)

  7. Director(指挥者):构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。
    它主要的两个作用:
    (1)隔离客户与对象的生成过程
    (2)负责控制产品对象的生产过程

二、普通方式建造对象

1、介绍

优点:简单、好理解、容易操作

缺点:

  1. 该方式建造对象,过于简单,没有设计缓冲层对象,程序的扩展和维护不好。
  2. 这种设计方式将产品(饺子)和创建产品的过程(做饺子的过程)封装在一起,耦合性增强

而建造者模提供的解决方案就是将产品和产品建造过程解耦。

2、代码

  1. /**
  2. * 抽象饺子类
  3. */
  4. public abstract class AbstractDumplings {
  5. //擀面皮
  6. public abstract void crust();
  7. //添加馅料
  8. public abstract void stuffing();
  9. //煮饺子
  10. public abstract void boil();
  11. public void build(){
  12. crust();
  13. stuffing();
  14. boil();
  15. }
  16. }
  1. /**
  2. * 牛肉饺子
  3. */
  4. public class BeefDumplings extends AbstractDumplings{
  5. @Override
  6. public void crust() {
  7. System.out.println("擀牛肉饺子面皮");
  8. }
  9. @Override
  10. public void stuffing() {
  11. System.out.println("包牛肉饺子");
  12. }
  13. @Override
  14. public void boil() {
  15. System.out.println("煮牛肉饺子");
  16. }
  17. }
  1. /**
  2. * 猪肉饺子
  3. */
  4. public class PorkDumplings extends AbstractDumplings{
  5. @Override
  6. public void crust() {
  7. System.out.println("擀猪肉饺子面皮");
  8. }
  9. @Override
  10. public void stuffing() {
  11. System.out.println("包猪肉饺子");
  12. }
  13. @Override
  14. public void boil() {
  15. System.out.println("煮猪肉饺子");
  16. }
  17. }
  1. public class Test {
  2. public static void main(String[] args) {
  3. BeefDumplings beefDumplings = new BeefDumplings();
  4. beefDumplings.build();
  5. System.out.println("----------------------------");
  6. PorkDumplings porkDumplings = new PorkDumplings();
  7. porkDumplings.build();
  8. }
  9. }

三、建造者模式

1、介绍

Product(产品角色):Dumplings

Builder(抽象建造者):DumplingsBuilder

ConcreteBuilder(具体建造者):BeefDumplings、PorkDumplings

Director(指挥者):DumplingsDirector

2、UML

3、代码实现

  1. /**
  2. * 饺子
  3. */
  4. public class Dumplings {
  5. //面皮
  6. private String crust;
  7. //馅料
  8. private String stuffing;
  9. //煮
  10. private String boil;
  11. public String getCrust() {
  12. return crust;
  13. }
  14. public void setCrust(String crust) {
  15. this.crust = crust;
  16. }
  17. public String getStuffing() {
  18. return stuffing;
  19. }
  20. public void setStuffing(String stuffing) {
  21. this.stuffing = stuffing;
  22. }
  23. public String getBoil() {
  24. return boil;
  25. }
  26. public void setBoil(String boil) {
  27. this.boil = boil;
  28. }
  29. }
  1. /**
  2. * 饺子构建者
  3. */
  4. public abstract class DumplingsBuilder {
  5. Dumplings dumplings = new Dumplings();
  6. //擀面皮
  7. public abstract void crust();
  8. //添加馅料
  9. public abstract void stuffing();
  10. //煮饺子
  11. public abstract void boil();
  12. public Dumplings build() {
  13. return dumplings;
  14. }
  15. }
  1. /**
  2. * 牛肉饺子
  3. */
  4. public class BeefDumplings extends DumplingsBuilder {
  5. @Override
  6. public void crust() {
  7. System.out.println("擀牛肉饺子面皮");
  8. }
  9. @Override
  10. public void stuffing() {
  11. System.out.println("包牛肉饺子");
  12. }
  13. @Override
  14. public void boil() {
  15. System.out.println("煮牛肉饺子");
  16. }
  17. }
  1. /**
  2. * 猪肉饺子
  3. */
  4. public class PorkDumplings extends DumplingsBuilder {
  5. @Override
  6. public void crust() {
  7. System.out.println("擀猪肉饺子面皮");
  8. }
  9. @Override
  10. public void stuffing() {
  11. System.out.println("包猪肉饺子");
  12. }
  13. @Override
  14. public void boil() {
  15. System.out.println("煮猪肉饺子");
  16. }
  17. }
  1. /**
  2. * 饺子指挥者
  3. */
  4. public class DumplingsDirector {
  5. private DumplingsBuilder dumplingsBuilder = null;
  6. public DumplingsDirector(DumplingsBuilder dumplingsBuilder){
  7. this.dumplingsBuilder = dumplingsBuilder;
  8. }
  9. /**
  10. * 获取饺子
  11. * @return
  12. */
  13. public Dumplings getDumplings() {
  14. dumplingsBuilder.crust();
  15. dumplingsBuilder.stuffing();
  16. dumplingsBuilder.boil();
  17. return dumplingsBuilder.build();
  18. }
  19. }
  1. public class Test {
  2. public static void main(String[] args) {
  3. DumplingsDirector dumplingsDirector = new DumplingsDirector(new BeefDumplings());
  4. dumplingsDirector.getDumplings();
  5. System.out.println("----------------------------------------------------------");
  6. DumplingsDirector dumplingsDirector2 = new DumplingsDirector(new PorkDumplings());
  7. dumplingsDirector2.getDumplings();
  8. }
  9. }