杭州劳保网站制作,jq网站特效插件,小程序搭建是什么意思,网站建设 无锡目录 1.概述2.结构3.实例3.1.产品类3.2.抽象建造者类3.3.具体建造者类3.4.指挥者类3.5.测试 4.优缺点5.使用场景6.模式扩展7.创建者模式对比 1.概述
建造者模式 (Builder Pattern) 是一种创建型设计模式#xff0c;用于创建复杂对象。它将对象的构建过程分离成独立的部分用于创建复杂对象。它将对象的构建过程分离成独立的部分同时允许按照不同的方式构建对象。通常情况下当一个对象的构建过程有多个步骤且这些步骤可以按照不同的顺序来构建时建造者模式就非常有用。通过将构建逻辑封装到具体的建造者类中客户端可以使用相同的构建过程来创建不同类型的对象。
2.结构
建造者模式包含如下角色
抽象建造者类 (Builder)这个接口规定要实现复杂对象的那些部分的创建并不涉及具体的部件对象的创建。具体建造者类 (ConcreteBuilder)实现 Builder 接口完成复杂产品的各个部件的具体创建方法。在构造过程完成后提供产品的实例。产品类 (Product)要创建的复杂对象。指挥者类 (Director)调用具体建造者来创建复杂对象的各个部分在指导者中不涉及具体产品的信息只负责保证对象各部分完整创建或按某种顺序创建。类图如下
3.实例
【例】创建共享单车生产自行车是一个复杂的过程它包含了车架车座等组件的生产。而车架又有碳纤维铝合金等材质的车座有橡胶真皮等材质。对于自行车的生产就可以使用建造者模式。这里 Bike 是产品包含车架车座等组件Builder 是抽象建造者MobikeBuilder 和 OfoBuilder 是具体的建造者Director 是指挥者。类图如下 具体代码如下
3.1.产品类
Bike.java
public class Bike {private String frame;//车架private String seat;//车座public String getFrame() {return frame;}public void setFrame(String frame) {this.frame frame;}public String getSeat() {return seat;}public void setSeat(String seat) {this.seat seat;}
}3.2.抽象建造者类
Builder.java
public abstract class Builder {//声明Bike类型的变量并进行赋值protected Bike bike new Bike();public abstract void buildFrame();public abstract void buildSeat();//构建自行车的方法public abstract Bike createBike();
}3.3.具体建造者类
MobileBuilder.java
//具体的构建者用来构建摩拜单车对象
public class MobileBuilder extends Builder{public void buildFrame() {bike.setFrame(碳纤维车架);}public void buildSeat() {bike.setSeat(真皮车座);}public Bike createBike() {return bike;}
}OfoBuilder.java
public class OfoBuilder extends Builder{public void buildFrame() {bike.setFrame(铝合金车架);}public void buildSeat() {bike.setSeat(橡胶车座);}public Bike createBike() {return bike;}
}3.4.指挥者类
Director.java
public class Director {//声明 builder 类型的变量private Builder builder;public Director(Builder builder) {this.builder builder;}//组装自行车的功能public Bike construct() {builder.buildFrame();builder.buildSeat();return builder.createBike();}
}3.5.测试
Client.java
public class Client {public static void main(String[] args) {//创建指挥者对象Director director new Director(new MobileBuilder());//让指挥者只会组装自行车Bike bike director.construct();System.out.println(bike.getFrame());System.out.println(bike.getSeat());}
}注意上面示例是 Builder 模式的常规用法指挥者类 Director 在建造者模式中具有很重要的作用它用于指导具体构建者如何构建产品控制调用先后次序并向调用者返回完整的产品类但是有些情况下需要简化系统结构可以把指挥者类和抽象建造者进行结合。
// 抽象 builder 类
public abstract class Builder {protected Bike mBike new Bike();public abstract void buildFrame();public abstract void buildSeat();public abstract Bike createBike();public Bike construct() {this.buildFrame();this.BuildSeat();return this.createBike();}
}4.优缺点
1建造者模式具有以下几个优点
分离构建过程和表示建造者模式可以将一个复杂对象的构建过程与它的表示分离使得相同的构建过程可以创建不同的表示。这样可以使代码结构更清晰易于阅读和维护。隐藏产品内部细节建造者模式将对象的构建过程封装在具体的建造者类中使得客户端可以不需要知道产品的内部实现细节只需要关注如何组装和使用产品。提供更好的控制由于建造者模式将构建过程分步进行可以通过指定不同的具体建造者实现不同的构建过程。这样就可以更灵活地控制构建过程根据需要定制复杂对象的创建方式。
2建造者模式的一些缺点包括
增加了代码量引入建造者模式会增加额外的代码量因为需要定义抽象建造者和具体建造者类以及指挥者类等。对于简单的对象构建过程可能会显得繁琐。对客户端的要求高客户端需要显式地创建指挥者对象并指定具体的建造者且需要了解建造者类的接口和使用方法。这对于不熟悉建造者模式的开发人员来说可能会增加学习成本。
综上所述建造者模式在创建复杂对象时具有很多优点但也需要在实际应用中权衡其优缺点来决定是否使用。
5.使用场景
1建造者模式适用于以下几种场景
当对象的构建过程比较复杂需要有多个步骤或者按照不同的顺序构建时可以使用建造者模式。例如创建一个包含多个部分的电子产品每个部分的构建方式可能不同而且可以按照不同的顺序组装。当需要创建的对象有多个不同的表示或配置时可以使用建造者模式。使用不同的具体建造者可以创建不同的对象表示而且可以在运行时动态地选择具体建造者。当想要隔离产品的构造和表示细节使得构造过程和最终的产品解耦时可以使用建造者模式。客户端只需要关注构建过程和产品的使用而不需要关注产品的内部实现细节。当需要创建一系列相似但稍有差异的对象时可以使用建造者模式。通过复用相同的构建逻辑和变化的部分可以高效地创建多个对象。当需要在一个对象的构建过程中能够灵活地修改构建方式或者增加更多的构建步骤时可以使用建造者模式。具体建造者的实现可以根据需求进行扩展和修改而不会影响到客户端代码。
2需要注意的是如果对象的构建过程相对简单没有多个步骤或者差异很小或者只有少数几个属性需要设置那么使用建造者模式可能会显得过于繁琐可以考虑使用其他创建型模式或者简化构建过程。
6.模式扩展
建造者模式除了上面的用途外在开发中还有一个常用的使用方式就是当一个类构造器需要传入很多参数时如果创建这个类的实例代码可读性会非常差而且很容易引入错误此时就可以利用建造者模式进行重构。 1重构前代码如下 Phone.java
public class Phone {private String cpu;private String screen;private String memory;private String mainboard;public Phone(String cpu, String screen, String memory, String mainboard) {this.cpu cpu;this.screen screen;this.memory memory;this.mainboard mainboard;}Overridepublic String toString() {return Phone{ cpu cpu \ , screen screen \ , memory memory \ , mainboard mainboard \ };}
}Client.java
public class Client {public static void main(String[] args) {//构建Phone对象Phone phone new Phone(麒麟,三星屏幕,金士顿,华硕主板);System.out.println(phone);}
}上面在客户端代码中构建Phone对象传递了四个参数如果参数更多那么代码的可读性会变差以及使用的成本会变高。
2重构后代码如下 Phone.java
public class Phone {private String cpu;private String screen;private String memory;private String mainboard;private Phone(Builder builder) {cpu builder.cpu;screen builder.screen;memory builder.memory;mainboard builder.mainboard;}public static final class Builder{private String cpu;private String screen;private String memory;private String mainboard;public Builder(){}public Builder cpu(String val){cpu val;return this;}public Builder screen(String val){screen val;return this;}public Builder memory(String val){memory val;return this;}public Builder mainboard(String val){mainboard val;return this;}public Phone build(){return new Phone(this);}}Overridepublic String toString() {return Phone{ cpu cpu \ , screen screen \ , memory memory \ , mainboard mainboard \ };}
}Client.java
public class Client {public static void main(String[] args) {//构建Phone对象Phone phone new Phone.Builder().cpu(麒麟).memory(金士顿).screen(三星屏幕).mainboard(华硕).build();System.out.println(phone);}
}重构后的代码在使用起来更方便某种程度上也可以提高开发效率。从软件设计上对程序员的要求比较高。
7.创建者模式对比
1工厂方法模式 VS 建造者模式 工厂方法模式注重的是整体对象的创建方式而建造者模式注重的是部件构建的过程意在通过一步一步地精确构造创建出一个复杂的对象。
2抽象工厂模式 VS 建造者模式
抽象工厂模式实现对产品家族的创建一个产品家族是这样的一系列产品具有不同分类维度的产品组合采用抽象工厂模式则是不需要关心构建过程只关心什么产品由什么工厂生产即可。建造者模式则是要求按照指定的蓝图建造产品它的主要目的是通过组装零配件而产生一个新产品。 如果将抽象工厂模式看成汽车配件生产工厂生产一个产品族的产品那么建造者模式就是一个汽车组装工厂通过对部件的组装可以返回一辆完整的汽车。