设计模式 (四)创建者模式(Builder)
- 格式:doc
- 大小:83.50 KB
- 文档页数:6
Builder模式在实践中的应用Builder模式是一种对象创建的设计模式,可以将复杂的对象分解为简单的部分,然后逐步建立起来。
这个模式在实践中十分常见,适用于需要构建多种不同属性的对象。
在本文中,我们将介绍Builder模式的定义和实现,以及在不同场景中的运用。
1. Builder模式的定义Builder模式是面向对象设计模式的一种,它主要用于对象的创建过程。
当需要创建在结构上复杂的对象时,就可以使用Builder模式。
该模式通过一个共享接口来逐步构造复杂对象,以此来减少构建过程的复杂性,并且允许我们改变对象的内部表示。
在Builder模式中,我们需要定义一个Builder接口,包含构建复杂对象所需要的方法。
然后,我们需要一个具体的Builder类来实现该接口,并定义一个产品类作为最终的结果。
最后,我们还需要一个Director类来处理Builder和产品实例之间的交互。
这样,在实际使用中,我们只需要组织Director、Builder和具体产品的实现,就可以构造复杂对象了。
2. Builder模式的实现在实现Builder模式之前,我们需要确定要创建的对象类型。
假设我们正在开发一款游戏,需要创建一些角色角色,如法师、战士、骑士等等。
首先,我们需要定义一个Builder接口,包含构建复杂对象的具体方法。
在这里,我们需要定义三个方法,用于构建角色的属性、装备以及技能。
public interface RoleBuilder {void buildAttributes(Attribute attribute);void buildEquipment(Equipment equipment);void buildSkills(Skill skill);}然后,我们需要通过实现该接口,定义具体的Builder类。
因为我们需要实现多个角色,我们使用抽象类来定义构建过程。
public abstract class AbstractRoleBuilder implements RoleBuilder {protected Role role;public AbstractRoleBuilder() {role = new Role();}public Role getRole() {return role;}@Overridepublic void buildAttributes(Attribute attribute) {role.setAttribute(attribute);}@Overridepublic void buildEquipment(Equipment equipment) { role.setEquipment(equipment);}@Overridepublic void buildSkills(Skill skill) {role.setSkills(skill);}}接下来,我们需要定义一个角色类,作为Builder模式的最终目标。
软件开发中的设计模式有哪些在软件开发的领域中,设计模式就像是一套经过实践检验的解决方案,帮助开发者更高效、更优雅地解决常见的问题。
它们是软件开发中的宝贵经验总结,为构建可维护、可扩展和灵活的软件系统提供了有力的支持。
接下来,让我们一起探索一下软件开发中常见的设计模式。
一、创建型设计模式1、单例模式(Singleton Pattern)单例模式确保一个类只有一个实例存在,并提供一个全局访问点来获取该实例。
这在某些情况下非常有用,比如一个系统中只需要一个数据库连接池或者一个日志记录器。
想象一下,如果多个线程同时创建多个数据库连接池实例,不仅会浪费资源,还可能导致混乱。
通过单例模式,我们可以保证只有一个实例存在,有效地管理资源。
2、工厂模式(Factory Pattern)当我们需要创建对象,但又不想让客户端直接与具体的类进行交互时,工厂模式就派上用场了。
它定义了一个用于创建对象的接口,让子类决定实例化哪一个类。
比如,在一个汽车生产厂中,有不同类型的汽车(轿车、SUV 等),我们可以通过一个工厂类根据需求来创建相应类型的汽车对象,而客户端只需要向工厂请求即可,无需关心具体的创建细节。
3、抽象工厂模式(Abstract Factory Pattern)抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
例如,一个家具厂可能生产多种风格的家具(现代风格、古典风格),每种风格都有配套的椅子、桌子和沙发。
通过抽象工厂模式,我们可以根据用户选择的风格创建一整套家具,保证了风格的一致性和协调性。
4、建造者模式(Builder Pattern)建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
比如构建一个电脑配置,我们可以有不同的 CPU、内存、硬盘等组件选择,通过建造者模式,可以清晰地定义构建的步骤和顺序,同时能够灵活地组合不同的组件来创建出各种不同配置的电脑。
java 创建者builder 使用predicate 简书摘要:1.Java 创建者Builder 的使用2.Predicate 的简介3.简书的特点和优势正文:【Java 创建者Builder 的使用】在Java 编程中,创建者模式(Builder)是一种常用的设计模式,主要用于构建复杂对象。
创建者模式的核心思想是将一个复杂对象的构建过程和表示分离,使得同样的构建过程可以创建不同的表示。
这种设计模式在简化代码结构、提高代码可读性和可维护性方面具有很大的优势。
在实际应用中,我们可以通过以下方式使用Java 创建者Builder:1.首先,创建一个表示复杂对象的类,例如`Person`。
```javapublic class Person {private String name;private int age;private String address;// 构造函数、getter 和setter 方法}```2.创建一个`Person.Builder`类,用于构建`Person`对象。
```javapublic class PersonBuilder {private String name;private int age;private String address;public PersonBuilder setName(String name) { = name;return this;}public PersonBuilder setAge(int age) {this.age = age;return this;}public PersonBuilder setAddress(String address) { this.address = address;return this;}public Person build() {return new Person(name, age, address);}}```3.使用`Person.Builder`类构建`Person`对象。
设计模式分类(创建型模式、结构型模式、⾏为型模式)1.创建型模式前⾯讲过,社会化的分⼯越来越细,⾃然在软件设计⽅⾯也是如此,因此对象的创建和对象的使⽤分开也就成为了必然趋势。
因为对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进⾏研究,从⽽能够⾼效地创建对象就是创建型模式要探讨的问题。
这⾥有6个具体的创建型模式可供研究,它们分别是:简单⼯⼚模式(Simple Factory)⼯⼚⽅法模式(Factory Method)抽象⼯⼚模式(Abstract Factory)创建者模式(Builder)原型模式(Prototype)单例模式(Singleton)说明:严格来说,简单⼯⼚模式不是GoF总结出来的23种设计模式之⼀。
2.结构型模式在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发⼈员关注的焦点,因为如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。
对象结构的设计很容易体现出设计⼈员⽔平的⾼低,这⾥有7个具体的结构型模式可供研究,它们分别是:外观模式/门⾯模式(Facade门⾯模式)适配器模式(Adapter)代理模式(Proxy)装饰模式(Decorator)桥梁模式/桥接模式(Bridge)组合模式(Composite)享元模式(Flyweight)3.⾏为型模式在对象的结构和对象的创建问题都解决了之后,就剩下对象的⾏为问题了,如果对象的⾏为设计的好,那么对象的⾏为就会更清晰,它们之间的协作效率就会提⾼,这⾥有11个具体的⾏为型模式可供研究,它们分别是:模板⽅法模式(Template Method)观察者模式(Observer)状态模式(State)策略模式(Strategy)职责链模式(Chain of Responsibility)命令模式(Command)访问者模式(Visitor)调停者模式(Mediator)备忘录模式(Memento)迭代器模式(Iterator)解释器模式(Interpreter)。
作用:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder模式和AbstractFactory模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。
而在AbstractFactory模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。
适用于以下情况:1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2)当构造过程必须允许被构造的对象有不同的表示时。
UML图如下:Builder:定义创建对象过程的抽象,提供构建不同组成部分的接口其中:BuildPartA,BuildPartB,BuildPartC是对一个对象不同部分的构建函数接口,由Builder 的派生类ConcreteBuilder1、ConcreteBuilder2来具体实现.另外还有一个需要注意的函数,就是Director::Construct函数,这个函数里面通过调用上面的接口函数完成对象的构建--也就是说各个不同部分装配的过程都是一致的(同样的调用的Construct函数),但是不同的构建方式会有不同的表示(根据Builder的实际类型来决定如何构建,也就是多态)Builder模式是基于这样的一个情况:一个对象可能有不同的组成部分,这几个部分的不同的创建对象会有不同的表示,但是各个部分之间装配的方式是一致的.比方说一辆单车,都是由车轮车座等等的构成的(一个对象不同的组成部分),不同的品牌生产出来的也不一样(不同的构建方式).虽然不同的品牌构建出来的单车不同,但是构建的过程还是一样的也就是说,Director::Construct函数中固定了各个组成部分的装配方式,而具体是装配怎样的组成部分由Builder的派生类实现.实现:Builder模式的实现基于以下几个面向对象的设计原则:1)把变化的部分提取出来形成一个基类和对应的接口函数,在这里不会变化的是都会创建PartA 和PartB,变化的则是不同的创建方法,于是就抽取出这里的Builder基类和BuildPartA,BuildPartB接口函数2)采用聚合的方式聚合了会发生变化的基类,就是这里Director聚合了Builder类的指针.以上,通过两个派生类ConcreteBuilder1、ConcreteBuilder2定义了两种不同的建造细节(建造步骤是一样的,由Construct函数确定),通过两个派生类所建造出来的对象,对外部所展现出来的属性或者功能是不一样的,由各自Builder派生类中的建造方法(BuildPartA、BuildPartB、BuildPartC)决定。
设计模式主要分三个类型:创建型、结构型和行为型。
其中创建型有:一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
行为型有:六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。
十、State,状态模式:允许对象在其内部状态改变时改变他的行为。
对象看起来似乎改变了他的类。
十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
java builder用法Java Builder用法是Java编程方式的一种设计模式,在实现复杂对象的构造时有特别重要的作用。
它可以让建造者和客户端相分离,使客户端不再直接和复杂的内部构造结构打交道,从而极大地提高程序的复用性、灵活性和可扩展性。
Builder模式的实现是相当简单的:它主要包括三个组件:Product (产品)、Builder(构建者)和Director(导演)。
Product是构建的对象,它实际上是一个抽象类,用于封装所有需要配置的内容;Builder是构建的基类,它定义了实际构建的步骤,这些步骤由子类实现;Director负责调用Builder的方法进行构建,并返回最终的Product。
因此,Builder模式划分为以下步骤:1. 定义Product抽象类;2. 定义Builder抽象类,它定义实际构建的步骤;3. 定义具体的Builder子类,实现Builder抽象类中定义的步骤;4. 定义Director类,它负责调用Builder的方法来进行构建;5. 客户端根据具体情况调用Director进行构建;6. Director调用Builder来进行构建,并返回最终的Product。
使用Builder模式的好处在于可以将复杂的构建过程分离出去,将客户端和复杂的构建结构分离开来,使得客户端只需要知道如何组装和使用Product即可,而不用关心Product的内部构建细节。
此外,将复杂的构建过程封装在Builder类中,使得构建过程更加可控,客户端可以更加灵活地使用Builder来构建复杂的对象,从而极大提高了程序的复用性、灵活性和可扩展性。
因此可以总结为:使用builder模式可以将构建过程从客户端分离开来,使得开发人员可以更加灵活地使用Builder来构建复杂的对象,从而提高程序的复用性、灵活性和可扩展性。
23种设计模式记忆口诀设计模式是软件开发中常见的解决方案模板,它们能够解决许多常见的设计问题。
为了帮助记忆23种设计模式,可以使用下面这个口诀来记忆:Creational Patterns(创建型模式):1. Singleton(单例模式):一个类能产生一个实例,全局访问。
2. Builder(建造者模式):分步骤创建复杂对象,易拓展。
3. Factory Method(工厂方法模式):子类决定实例化哪个对象。
4. Abstract Factory(抽象工厂模式):创建一组相关对象,不依赖具体类。
5. Prototype(原型模式):通过复制现有对象来创建新对象。
Structural Patterns(结构型模式):6. Adapter(适配器模式):将类的接口转换为客户端希望的接口。
7. Bridge(桥接模式):将抽象部分与实际部分分离。
将对象组合成树形结构来表示部分整体的层次结构。
9. Decorator(装饰器模式):动态地给对象添加功能。
10. Facade(外观模式):提供一个统一的接口,简化客户端使用。
11. Flyweight(享元模式):共享细粒度对象,减少内存使用。
12. Proxy(代理模式):控制对其他对象的访问。
Behavioral Patterns(行为型模式):13. Chain Of Responsibility(责任链模式):将请求的发送者和接收者解耦,多个对象都可能处理请求。
将请求封装成对象,可以用参数化方式处理。
15. Iterator(迭代器模式):提供一种遍历集合的统一接口。
16. Mediator(中介者模式):将多个对象之间的复杂关系解耦。
17. Memento(备忘录模式):将对象的状态保存起来,以后可以恢复。
18. Observer(观察者模式):当一个对象改变状态时,依赖它的对象都会收到通知。
19. State(状态模式):对象的行为随状态的改变而改变。
java常用的设计模式及应用场景一、单例模式(Singleton)单例模式是一种对象创建型模式,它指的是设计一个类,使其只能生成一个实例。
它只提供一个类实例,保证只有一个实例存在。
有时候,只需要一个类的实例来控制整个系统,例如实现一个全局的缓存,或是建立一个共享的日志记录器,单例模式可以很好的实现这个目的。
应用场景:1、对于需要频繁创建和销毁的对象,可以考虑使用单例模式,以避免过多地重复创建和销毁造成系统开销。
2、对于某些资源比较宝贵的对象,例如数据库连接,则可以用单例模式进行封装,保证全局应用程序只有一个,从而避免重复创建,浪费资源。
二、工厂模式(Factory)工厂模式是一种类创建型模式,它把类的实例化推迟到子类来完成。
它用于隔离客户类和实例化对象,通过声明抽象类类来定义构造过程,将不同的定义转移到不同的子类中去,从而使用户不需要关心实例化过程。
1、在有大量不同对象需要创建和管理的情况下,可以利用工厂模式封装类的实例化和存储,将池中不同对象来进行统一管理。
2、在使用设计模式的情况下,复杂的类结构已经不适合用一个实例来创建,可以采用工厂模式实现多个类的实例化,让用户不用关心对象实例的创建过程。
抽象工厂模式是一种工厂模式的拓展,它把简单工厂模式的单一职责拆分为多个类,从而实现一个系列相关的或相互依赖的工厂,以满足比较复杂的对象创建需求。
1、在需要创建复杂对象,而复杂对象又由多个部件组成的情况下,例如计算机,单一工厂模式已经不能满足需求,那么可以通过抽象工厂模式来实现。
2、在需要产生大量不同类型的对象,或者存在一系列相互依赖的产品族,这种情况下可以使用抽象工厂模式,将工厂定义为不同维度组成的一个系列。
四、建造者模式(Builder)建造者模式是一种设计模式,它也叫构造子模式,通过使用建造者模式,客户端可以不必担心具体的生产过程,只需要给出具体的请求,由建造者来负责构造出请求的产品对象。
1、在有复杂的产品对象的时候,例如需要对多个部件进行拼装,以构造出复杂的对象,可以采用建造者模式将复杂的拼装过程进行封装,避免复杂的拼装过程变得混乱。
Builder模式小组成员:马茹浩,肖思宇李明烨,阎慧玲1.概述在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定。
2. 意图将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
3. 适用性在以下情况使用Builder模式•当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
•当构造过程必须允许被构造的对象有不同的表示时。
4. 结构此模式结构如下页上图所示。
5. 构建模式的组成• 抽象建造者角色(Builder):为创建一个Product对象的各个部件指定抽象接口,以规范产品对象的各个组成成分的建造。
一般而言,此角色规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
•具体建造者(ConcreteBuilder)1)实现Builder的接口以构造和装配该产品的各个部件。
即实现抽象建造者角色Builder 的方法。
2)定义并明确它所创建的表示,即针对不同的商业逻辑,具体化复杂对象的各部分的创建3) 提供一个检索产品的接口4) 构造一个使用Builder接口的对象即在指导者的调用下创建产品实例指导者(Director):调用具体建造者角色以创建产品对象的各个部分。
指导者并没有涉及具体产品类的信息,真正拥有具体产品的信息是具体建造者对象。
它只负责保证对象各部分完整创建或按某种顺序创建。
产品角色(Product):建造中的复杂对象。
它要包含那些定义组件的类,包括将这些组件装配成产品的接口。
6. 交互过程7. 效果Builder模式的主要效果:1 ) 它使你可以改变一个产品的内部表示Builder对象提供给导向器一个构造产品的抽象接口。
该接口使得生成器可以隐藏这个产品的表示和内部结构。
它同时也隐藏了该产品是如何装配的。
设计模式(四)创建者模式(Builder)创建者模式主要是为了所谓的高聚合,解耦合,遇到多种配件于一身的情况的时候,放在实体类里面不合适,放在工厂类也不合适,所以就添加了一个创建者类,专门对相应的零件进行组装,如同汽车了N中配件,同时要是各种配件互相联系的话也在这个Builder里面一并做了。
明天准备去爬山,这个原理图就再补上吧:今天把uml补上了,不过对于uml初学的我就乱乱的先随便画一个吧,等以后慢慢入门了在斟酌里面的错误和细节:下面是我自己攒出来的例子(回来的时候着急,把书忘教室了,不知道书上怎么写的,不过明显记得一处错误,构造器也加上了一个void),为了在Builder里面优化一下,用了一下反射,这样就可以直接通过多态来实现对于派生类中的实体类进行初始化并且操作了,简单的实现电脑的组装:通过工厂类实例化Computer的父类指向子类的实例,然后在Builder 里面添加一个工厂类的私有变量,通过构造器把要穿件的Computer实例传入Builder,然后对其进行解析,反射得到路径,对其派生类里面的方法进行反射得到相应的配件的集成,转配完成。
少说多做:[java]view plaincopy1.package com.designpattern.builder;2.3.public interface Mouse {4.public void add();5.}[java]view plaincopy1.package com.designpattern.builder;2.3.public interface Monitor {4.public void add();5.}[java]view plaincopy1.package com.designpattern.builder;2.3.public interface Keyboard {4.public void add();5.}[java]view plaincopy1.package com.designpattern.builder;2.3.public interface Displayer {4.public void add();5.}[java]view plaincopy1.package com.designpattern.builder;2.3.public interface Factory {4.public Computer buildComputer();5.}[java]view plaincopy1.package com.designpattern.builder;2.3.public interface Computer {4.public void add();5.}[java]view plaincopy1.package com.designpattern.builder;3.public class AcerMouse implements Mouse {4.5.@Override6.public void add() {7. System.out.println("add AcerMouse");8. }9.10.}[java]view plaincopy1.package com.designpattern.builder;2.3.public class AcerMonitor implements Monitor {4.5.@Override6.public void add() {7. System.out.println("add AcerMonitor");8. }9.10.}[java]view plaincopy1.package com.designpattern.builder;2.3.public class AcerKeyboard implements Keyboard {4.5.@Override6.public void add() {7. System.out.println("add AcerKeyboard");8. }9.10.}[java]view plaincopy1.package com.designpattern.builder;2.3.public class AcerDisplayer implements Displayer {5.@Override6.public void add() {7. System.out.println("add AcerDisplayer");8. }9.10.}[java]view plaincopy1.package com.designpattern.builder;2.3.public class AcerFactory implements Factory {4.5.@Override6.public Computer buildComputer() {7.return new Acer();8. }9.}[java]view plaincopy1.package com.designpattern.builder;2.3.public class Acer implements Computer {4.5.@Override6.public void add() {7. System.out.println("builder Acer");8. }9.10.}[java]view plaincopy1.package com.designpattern.builder;2.3.import ng.reflect.Method;4.5.public class Builder {6.private Factory factory;8.public Builder(Factory factory) {9.this.factory = factory;10. }11.12.public void builder() throws Exception {13. factory.buildComputer().add();14. String computer = factory.getClass().toString();15. computer = computer.substring(6, computer.length() - 7);16.17.// build Mouse18. Class c = Class.forName(computer + "Mouse");19. Mouse mouse = (Mouse) c.newInstance();20. Method method = c.getMethod("add", null);21. method.invoke(mouse, null);22.23.// build Keyboard24. c = Class.forName(computer + "Keyboard");25. Keyboard keyboard = (Keyboard) c.newInstance();26. method = c.getMethod("add", null);27. method.invoke(keyboard, null);28.29.// build Displayer30. c = Class.forName(computer + "Displayer");31. Displayer displayer = (Displayer) c.newInstance();32. method = c.getMethod("add", null);33. method.invoke(displayer, null);34.35.// build Monitor36. c = Class.forName(computer + "Monitor");37. Monitor monitor = (Monitor) c.newInstance();38. method = c.getMethod("add", null);39. method.invoke(monitor, null);40.41. System.out.println("build complete");42. }43.}[java]view plaincopy1.package com.designpattern.builder;2.3.public class Client {4.public static void main(String[] args) {5.try {6.new Builder(new AcerFactory()).builder();7. } catch (Exception e) {8.// TODO Auto-generated catch block9. e.printStackTrace();10. }11. }12.}本文转自csdn:/column/details/first-study-pattern.html。