大话设计模式读书笔记——建造者模式

编程入门 行业动态 更新时间:2024-10-27 00:26:26

大话设计<a href=https://www.elefans.com/category/jswz/34/1771241.html style=模式读书笔记——建造者模式"/>

大话设计模式读书笔记——建造者模式

文章目录

  • 1. 前言
  • 2. 需求
  • 3. 代码版本1.0
  • 4. 增加需求
  • 5. 代码版本2.0
    • 5.1 瘦人类(胖人类也类似)
    • 5.2 客户端
    • 5.3 弊端
  • 6. 建造者模式
    • 6.1 概念
    • 6.2 案例代码
      • 6.2.1 UML类图
      • 6.2.2 产品类
      • 6.2.3 抽象建造者类
      • 6.2.4 具体建造者类
      • 6.2.5 指挥者类
      • 6.2.6 客户端
    • 6.3 代码版本3.0
      • 6.3.1 UML 类图
      • 6.3.2 抽象的建造者类
      • 6.3.3 瘦小人建造者(胖小人建造者类似)
      • 6.3.4 指挥者
      • 6.3.5 客户端


1. 前言

2. 需求

用程序画一个小人,要求是小人要有头、身体、两手、两脚。

3. 代码版本1.0

public class Test extends JFrame {public Test(){setSize(400,400);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setLocationRelativeTo(null);}public void paint(Graphics g){g.drawOval(150,120,30,30);g.drawRect(160,150,10,50);g.drawLine(160,150,140,200);g.drawLine(170,150,190,200);g.drawLine(160,200,145,250);g.drawLine(170,200,185,250);}public static void main(String[] args) {new Test().setVisible(true);}
}

输出结果:

4. 增加需求

再画一个身体比较胖的小人。

5. 代码版本2.0

画人的时候,头身手脚是必不可少的,开发时也是不能少。因此,可以建两个类,一个是瘦人的类,一个是胖人的类。

5.1 瘦人类(胖人类也类似)

public class PersonThinBuilder {private Graphics g;public PersonThinBuilder(Graphics g){this.g = g;}public void paint(){g.drawOval(150,120,30,30);g.drawRect(160,150,10,50);g.drawLine(160,150,140,200);g.drawLine(170,150,190,200);g.drawLine(160,200,145,250);g.drawLine(170,200,185,250);}
}

5.2 客户端

public void paint(Graphics g){//初始化瘦小人建造类PersonThinBuilder gThin = new PersonThinBuilder(g);gThin.build();//初始化胖小人建造类PersonFatBuilder gFat = new PersonThinBuilder(g);gFat.build();
}

5.3 弊端

比如现在再增加需求:加一个高个的小人。你会不会因为编程不注意,让他缺胳膊少腿呢?
因此最好的办法是规定,凡是建造小人,都必须要有头和身体,以及两手两脚。

6. 建造者模式

如果你需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要应用于一个设计模式,建造者模式(Builder),又叫生成器模式

6.1 概念

建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

6.2 案例代码

6.2.1 UML类图

6.2.2 产品类

public class Product {ArrayList<String> parts = new ArrayList<String>();//添加新的产品部件public void add(String part){parts.add(part);}//列举所有产品部件public void show(){for (String part : parts) {System.out.println(part);}}
}

6.2.3 抽象建造者类

public abstract class Builder {public abstract void buildPartA();//建造部件Apublic abstract void buildPartB();//建造部件Bpublic abstract Product getResult();//得到产品
}

6.2.4 具体建造者类

public class ConcreteBuilder1 extends Builder{private Product product = new Product();@Overridepublic void buildPartA() {product.add("部件A");}@Overridepublic void buildPartB() {product.add("部件B");}@Overridepublic Product getResult() {return product;}
}
public class ConcreteBuilder2 extends Builder{private Product product = new Product();@Overridepublic void buildPartA() {product.add("部件X");}@Overridepublic void buildPartB() {product.add("部件Y");}@Overridepublic Product getResult() {return product;}
}

6.2.5 指挥者类

//指挥者
public class Director {public void construct(Builder builder){builder.buildPartA();builder.buildPartB();}
}

6.2.6 客户端

public class Client {public static void main(String[] args) {Director director = new Director();Builder b1 = new ConcreteBuilder1();Builder b2 = new ConcreteBuilder2();//指挥者用ConcreteBuilder1的方法来创建产品director.construct(b1);Product p1 = b1.getResult();p1.show();//指挥者用ConcreteBuilder2的方法来创建产品director.construct(b2);Product p2 = b2.getResult();p2.show();}
}

6.3 代码版本3.0

6.3.1 UML 类图

6.3.2 抽象的建造者类

先定义一个抽象的建造人的类,来把这个过程给稳定住,不让任何人遗忘当中的任何一步

//抽象的建造者类
public abstract class PersonBuilder {protected Graphics g;public PersonBuilder(Graphics g){this.g = g;}public abstract void buildHead();public abstract void buildBody();public abstract void buildArmLeft();public abstract void buildArmRight();public abstract void buildLegLeft();public abstract void buildLegRight();
}

6.3.3 瘦小人建造者(胖小人建造者类似)

"然后,我们需要建造一个瘦的小人,则让这个瘦子类去继承这个抽象类,那就必须去重写这些抽象方法了。

public class PersonThinBuilder extends PersonBuilder{public PersonThinBuilder(Graphics g) {super(g);}@Overridepublic void buildHead() {g.drawOval(150,120,30,30);}@Overridepublic void buildBody() {g.drawRect(160,150,10,50);}@Overridepublic void buildArmLeft() {g.drawLine(160,150,140,200);}@Overridepublic void buildArmRight() {g.drawLine(170,150,190,200);}@Overridepublic void buildLegLeft() {g.drawLine(160,200,145,250);}@Overridepublic void buildLegRight() {g.drawLine(170,200,185,250);}
}

6.3.4 指挥者

public class PersonDirector {private PersonBuilder pb;public PersonDirector(PersonBuilder pb){this.pb = pb;}//根据用户的需要建造小人public void CreatePerson(){pb.buildHead();pb.buildBody();pb.buildArmLeft();pb.buildArmRight();pb.buildLegLeft();pb.buildLegRight();}
}

6.3.5 客户端

public class Client extends JFrame {public Client(){setSize(400,400);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setLocationRelativeTo(null);}public void paint(Graphics g){PersonBuilder gThin = new PersonThinBuilder(g);PersonDirector pdThin = new PersonDirector(gThin);pdThin.CreatePerson();PersonBuilder gFat = new PersonFatBuilder(g);PersonDirector pdFat = new PersonDirector(gFat);pdFat.CreatePerson();}public static void main(String[] args) {new Client().setVisible(true);}
}

更多推荐

大话设计模式读书笔记——建造者模式

本文发布于:2024-03-09 04:56:03,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1723881.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模式   大话   读书笔记

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!