浅谈工厂和建造者模式
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‘}
以上是关于浅谈工厂和建造者模式的主要内容,如果未能解决你的问题,请参考以下文章