浅谈工厂和建造者模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈工厂和建造者模式相关的知识,希望对你有一定的参考价值。

参考技术A 最近在写安卓项目,在引入rxJava和Retrofit发现大量引用的建造者模式。那在此就记录和简单介绍一下两者的区别和使用方法。
工厂模式和建造者模式都属于创建型模式,它对类的实例化进行了抽象。

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。

2.类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变。
举个例子:自主创建需要的产品对象(小米和苹果),达到增加新产品时无需修改其他具体的工厂和具体类的目的。

抽象工厂模式与工厂方法模式最大的区别在于:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则针对的是多个产品等级结构。
优点:抽象工厂模式同样具备隔离具体类生成。并且当一个产品族中的多个对象设计成一起工作时,他能够保证客户端始终只使用同一个产品族中的对象。
缺点:再添加新的产品对象时,难以扩展抽象工厂模式以便产生新种类产品。
然后比较最多的应该就是抽象工厂和建造者模式,下面就简单介绍一下建造者模式。

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。
举个例子:1、工厂(建造者模式):负责制造汽车(组装过程和细节在工厂内)
2、汽车购买者(用户):你只需要说出你需要的型号(对象的类型和内容),然后直接购买就可以使用了
(不需要知道汽车是怎么组装的(车轮、车门、发动机、方向盘等等))

示例分析:
1、小高定制买车,老板(Diretor)和小高(Client)进行需求沟通(越野?日常?撩妹?)
2、了解需求后,电脑城老板将小高需求划分为各个部件(Builder)的建造请求(发动机、车身、颜色)
3、指挥装机人员(ConcreteBuilder)去构建组件;
4、将组件组装起来成小高需要的汽车(Product)

优点:1、将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
2、将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。
缺点:如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

抽象工厂模式比建造者模式的尺度要大,它关注产品整体,而建造者模式关注构建过程,因此建造者模式可以很容易地构建出一个崭新的产品,只要导演类能够提供具体的工艺流程。也正因为如此,两者的应用场景截然不同,如果希望屏蔽对象的创建过程,只提供一个封装良好的对象,则可以选择抽象工厂方法模式。而建造者模式可以用在构件的装配方面,如通过装配不同的组件或者相同组件的不同顺序,可以产生出一个新的对象,它可以产生一个非常灵活的架构,方便地扩展和维护系统。

建造者模式

简介

  建造者模式使用多个简单的对象创建一个复杂的对象,用于将一个复杂的构建与其表示分离,使得同样的构建过程可以创建不同的表示,然后通过一个builder类创建最终的对象。

  注意,建造者模式与工厂模式的最大区别是,建造者模式更关注产品的组合方式和装配顺序,而工厂模式关注产品的生产本身。

  建造者模式在设计时有以下几种角色。

  Builder:创建一个复杂产品对象的抽象接口。

  ConcreteBuilder:Builder接口的实现类,用于定义复杂产品各个部件的装配流程。

  Director:构造一个使用Builder接口的对象。

  Product:表示被构造的复杂对象。ConcreteBuilder定义了该复杂对象的装配流程,而Product定义了该复杂对象的结构和内部表示。

  以生产一个电脑为例,电脑的生产包括CPU,Memory,Disk等生产过程,这些生产过程对顺序不敏感,这里的Product就是电脑。

具体实现

  1.定义需要生产的Computer

public class Computer {
    private String cpu;
    private String memory;
    private String disk;

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public String getDisk() {
        return disk;
    }

    public void setDisk(String disk) {
        this.disk = disk;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "cpu=‘" + cpu + ‘‘‘ +
                ", memory=‘" + memory + ‘‘‘ +
                ", disk=‘" + disk + ‘‘‘ +
                ‘}‘;
    }
}

  以上代码定义了一个Computer类来描述我们要生产的产品。

  2.定义抽象接口ComputerBuilder来描述产品构造和装配的过程。

public interface ComputerBuilder {
    void buildCpu();
    void buildMemory();
    void buildDisk();
    Computer buildComputer();
}

  3.定义ComputerBuilder接口实现类ComputerConcreteBuilder以实现构造和装配该产品的各个细节。

public class ComputerConcreteBuilder implements ComputerBuilder {

    Computer computer;

    public ComputerConcreteBuilder(){
        computer = new Computer();
    }

    @Override
    public void buildCpu() {
        System.out.println("build cpu...");
        computer.setCpu("8 core");
    }

    @Override
    public void buildMemory() {
        System.out.println("build memory...");
        computer.setMemory("16 GB");
    }

    @Override
    public void buildDisk() {
        System.out.println("build disk...");
        computer.setDisk("1 TB");
    }

    @Override
    public Computer buildComputer() {
        return computer;
    }
}

  4.定义ComputerDirector使用Builder接口实现产品的装配

public class ComputerDirector {
    public Computer constructComputer(ComputerBuilder computerBuilder){
        computerBuilder.buildCpu();
        computerBuilder.buildMemory();
        computerBuilder.buildDisk();
        return computerBuilder.buildComputer();
    }
}

  以上代码定义了ComputerDirector来调用ComputerBuilder接口实现电脑的组装,具体组装顺序为buildCpu,buildMemory,buildDisk和buildComputer。该类是建造者模式对产品生产过程的封装,在需求发生变化且需要先装配完磁盘再装配内存时,只需要调整Director的顺序即可,每个组件的装配都稳定不变。

  5.构建Computer

public class Test {
    public static void main(String[] args) {
        ComputerDirector computerDirector = new ComputerDirector();
        ComputerBuilder computerBuilder = new ComputerConcreteBuilder();
        Computer computer = computerDirector.constructComputer(computerBuilder);
        System.out.println(computer);
    }
}

  以上代码首先定义了一个ComputerDirector和ComputerBuilder为构建Computer做好准备,然后通过调用ComputerDirector的constructComputer实现产品Computer的构建,运行结果如下

build cpu...
build memory...
build disk...
Computer{cpu=‘8 core‘, memory=‘16 GB‘, disk=‘1 TB‘}

 

以上是关于浅谈工厂和建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

建造者模式(Builder)

PHP 建造者模式

建造者模式

建造者模式

建造者模式和抽象工厂模式

建造者模式