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


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();//建造部件A
    public abstract void buildPartB();//建造部件B
    public abstract Product getResult();//得到产品
}

6.2.4 具体建造者类

public class ConcreteBuilder1 extends Builder{
    private Product product = new Product();
    @Override
    public void buildPartA() {
        product.add("部件A");
    }

    @Override
    public void buildPartB() {
        product.add("部件B");
    }

    @Override
    public Product getResult() {
        return product;
    }
}
public class ConcreteBuilder2 extends Builder{
    private Product product = new Product();
    @Override
    public void buildPartA() {
        product.add("部件X");
    }

    @Override
    public void buildPartB() {
        product.add("部件Y");
    }

    @Override
    public 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);
    }

    @Override
    public void buildHead() {
        g.drawOval(150,120,30,30);
    }

    @Override
    public void buildBody() {
        g.drawRect(160,150,10,50);
    }

    @Override
    public void buildArmLeft() {
        g.drawLine(160,150,140,200);
    }

    @Override
    public void buildArmRight() {
        g.drawLine(170,150,190,200);

    }

    @Override
    public void buildLegLeft() {
        g.drawLine(160,200,145,250);
    }

    @Override
    public 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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头盔程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值