欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

创建型模式之建造者模式(2.1)

程序员文章站 2022-06-24 08:59:54
什么是建造者模式? 工厂模式聚焦于创建出一个对象,而建造者除此之外还需要为创建的对象赋值。 简单来说,建造者模式=创建对象+属性赋值。 建造者模式应用场景 建造者模式适合创建 类中包含多个参数且需要定制化 的情况。 简单来说,建造者模式的目的就是创造 一条龙服务 :不仅创建出对象,顺便给属性赋值。 ......

什么是建造者模式?

工厂模式聚焦于创建出一个对象,而建造者除此之外还需要为创建的对象赋值。

简单来说,建造者模式=创建对象+属性赋值。


建造者模式应用场景

建造者模式适合创建类中包含多个参数且需要定制化的情况。

简单来说,建造者模式的目的就是创造一条龙服务:不仅创建出对象,顺便给属性赋值。


以计算机为例,计算机的性能大致由cpu,显卡,内存,硬盘这几个属性构成。

市面上更多的是已经组装好的成品,而不会让用户自己去配一台电脑出来。(当然自己也是可以配的)


市场根据需求分为游戏本,办公本以及娱乐本等等。不同的种类性能是不一样的。但会在一个大致的范畴。

如果将所有的cpu,显卡,硬盘等等排列组合,电脑的种类将难以计数。所以官方推出定制本不仅缩小了选择的难度。也提供了生产的方便。


写个demo实现:

虚线以上可以理解为服务端,一下可以理解为客户端。

那么生产一个产品的流程大致是这样的:实例化一个建造者实现类和一个指挥者装配类,调用指挥者转配类中的build方法实现建造者实现类的setter方法从而达到实例化产品的目的。


为什么需要建造者接口类和建造者实现类?

接口类控制的是产品的生产标准(实例化标准),每一个具体的产品都需要实现该接口完成产品创建。

优点:提升了扩展性。(客户端也可以通过接口的实现来创建自定义产品)


为什么需要指挥者装配类?

调用建造者实用类的setter方法即可完成产品的实例化创建,但这一部分对于每一个产品来说都是相同的。

那么在实例化产品的过程中,完全可以把这个重复且无任何变化的过程封装起来。实现代码复用。

class computer  //产品类
{
    private string cpu;
    private string gpu;
    private string memory;
    private string hardpan;

    public string getcpu() {
        return cpu;
    }

    public void setcpu(string cpu) {
        this.cpu = cpu;
    }

    public string getgpu() {
        return gpu;
    }

    public void setgpu(string gpu) {
        this.gpu = gpu;
    }

    public string getmemory() {
        return memory;
    }

    public void setmemory(string memory) {
        this.memory = memory;
    }

    public string gethardpan() {
        return hardpan;
    }

    public void sethardpan(string hardpan) {
        this.hardpan = hardpan;
    }

    @override
    public string tostring() {
        return "computer{" +
                "cpu='" + cpu + '\'' +
                ", gpu='" + gpu + '\'' +
                ", memory='" + memory + '\'' +
                ", hardpan='" + hardpan + '\'' +
                '}';
    }
}

interface computerbuilder    //建造者接口类
{
    void setcpu();
    void setgpu();
    void setmemeory();
    void sethardpan();
    computer build();
}

class hp_game implements computerbuilder   //建造者实现类
{
    private computer computer=new computer();


    @override
    public void setcpu() {
        computer.setcpu("i7 8300");
    }

    @override
    public void setgpu() {
        computer.setgpu("rtx1080i");
    }

    @override
    public void setmemeory() {
        computer.setmemory("32g");
    }

    @override
    public void sethardpan() {
        computer.sethardpan("500g m2");
    }

    @override
    public computer build() {
        return computer;
    }
}

class hp_work implements computerbuilder
{
    private computer computer=new computer();


    @override
    public void setcpu() {
        computer.setcpu("i6 7300");
    }

    @override
    public void setgpu() {
        computer.setgpu("mx250");
    }

    @override
    public void setmemeory() {
        computer.setmemory("4g");
    }

    @override
    public void sethardpan() {
        computer.sethardpan("500g sata");
    }

    @override
    public computer build() {
        return computer;
    }
}

class computerdirector   //指挥者装配类
{
    public computer build(computerbuilder cb)
    {
        cb.setcpu();
        cb.setgpu();
        cb.setmemeory();
        cb.sethardpan();

        return cb.build();
    }
}


//=============================
public class application
{

    public static void main(string[] args) {
        hp_game hp01 = new hp_game();
        hp_work hp02 = new hp_work();


        computerdirector computerdirector = new computerdirector();

        computer computer_hp1=computerdirector.build(hp01);
        system.out.println(computer_hp1);

        computer computer_hp02 =computerdirector.build(hp02);
        system.out.println(computer_hp02);

    }
}



客户端扩展一个产品实例

定义一个建造者实现类实现建造者接口类,并完成setter定制即可。

class computer  //产品类
{
    private string cpu;
    private string gpu;
    private string memory;
    private string hardpan;

    public string getcpu() {
        return cpu;
    }

    public void setcpu(string cpu) {
        this.cpu = cpu;
    }

    public string getgpu() {
        return gpu;
    }

    public void setgpu(string gpu) {
        this.gpu = gpu;
    }

    public string getmemory() {
        return memory;
    }

    public void setmemory(string memory) {
        this.memory = memory;
    }

    public string gethardpan() {
        return hardpan;
    }

    public void sethardpan(string hardpan) {
        this.hardpan = hardpan;
    }

    @override
    public string tostring() {
        return "computer{" +
                "cpu='" + cpu + '\'' +
                ", gpu='" + gpu + '\'' +
                ", memory='" + memory + '\'' +
                ", hardpan='" + hardpan + '\'' +
                '}';
    }
}

interface computerbuilder    //建造者接口类
{
    void setcpu();
    void setgpu();
    void setmemeory();
    void sethardpan();
    computer build();
}

class hp_game implements computerbuilder   //建造者实现类
{
    private computer computer=new computer();


    @override
    public void setcpu() {
        computer.setcpu("i7 8300");
    }

    @override
    public void setgpu() {
        computer.setgpu("rtx1080i");
    }

    @override
    public void setmemeory() {
        computer.setmemory("32g");
    }

    @override
    public void sethardpan() {
        computer.sethardpan("500g m2");
    }

    @override
    public computer build() {
        return computer;
    }
}

class hp_work implements computerbuilder
{
    private computer computer=new computer();


    @override
    public void setcpu() {
        computer.setcpu("i6 7300");
    }

    @override
    public void setgpu() {
        computer.setgpu("mx250");
    }

    @override
    public void setmemeory() {
        computer.setmemory("4g");
    }

    @override
    public void sethardpan() {
        computer.sethardpan("500g sata");
    }

    @override
    public computer build() {
        return computer;
    }
}

class computerdirector   //指挥者,复制给属性赋值
{
    public computer build(computerbuilder cb)
    {
        cb.setcpu();
        cb.setgpu();
        cb.setmemeory();
        cb.sethardpan();

        return cb.build();
    }
}


//=============================

class dell_game implements computerbuilder
{
    private computer computer=new computer();


    @override
    public void setcpu() {
        computer.setcpu("i7 9300");
    }

    @override
    public void setgpu() {
        computer.setgpu("gtx1090");
    }

    @override
    public void setmemeory() {
        computer.setmemory("32g");
    }

    @override
    public void sethardpan() {
        computer.sethardpan("500g m2");
    }

    @override
    public computer build() {
        return computer;
    }
}

public class application
{

    public static void main(string[] args) {
//        hp_game hp01 = new hp_game();
//        hp_work hp02 = new hp_work();


        computerdirector computerdirector = new computerdirector();

//        computer computer_hp1=computerdirector.build(hp01);
//        system.out.println(computer_hp1);
//
//        computer computer_hp02 =computerdirector.build(hp02);
//        system.out.println(computer_hp02);

        dell_game dell_game = new dell_game();
        computer computer_dell_game = computerdirector.build(dell_game);
        system.out.println(computer_dell_game);




    }
}



小结

建造者模式的目的是创建对象并给属性赋值;

换个角度思考,实现接口的建造者实现类在定义的时候就是为了实现产品类的(而具体的产品类是固定的)。所以这个类本身的目的就是为了实例化另外一个类。而指挥者通过调用这个类的setter方法完成对产品类的属性赋值。


建造者模式的核心目的是创建出带有实例化属性的对象,而且有良好的扩展性。(符合开闭原则)

建造者要建造啥——开箱即用的产品。