博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之建造者模式
阅读量:3918 次
发布时间:2019-05-23

本文共 4653 字,大约阅读时间需要 15 分钟。

定义:建造者模式(Builder Pattern)是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

特征:用户只需指定需要建造的类型就可以获得对象,建造过程及细节不需要了解

属于创建型模式

适用场景

适用于创建对象需要很多步骤,但是步骤的顺序不一定固定
如果一个对象有非常复杂的内部结构(很多属性)
把复杂对象的创建和使用分离

优点

封装性好,创建和使用分离
扩展性好,建造类之间独立,一定程度上解偶

缺点

产生多余的Builder对象
产品内部发生变化,建造者都要修改,成本较大

建造者模式和工厂模式的区别

1.建造者模式更加注重方法的调用顺序,工厂模式注重于创建对象
2.创建对象的粒度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的都一样
3.关注点:工厂模式只需要把对象创建出来就可以了,而建造者模式中不仅要创建出这个对象,还要知道这个对象由哪些部件组成
4.建造者模式根据建造过程中的顺序不一样,最终的对象部件组成也不一样

例子

简单使用
public class Product {
private String name; public String getName() {
return name; } public void setName(String name) {
this.name = name; } @Override public String toString() {
return "Product{" + "name='" + name + '\'' + '}'; }}
public interface IBuilder {
Product build();}
public class ConcreteBuilder implements IBuilder{
private Product product = new Product(); @Override public Product build() {
return product; }}
public class Director {
public static void main(String[] args) {
IBuilder builder = new ConcreteBuilder(); System.out.println(builder.build()); }}
实际代码使用
public class Course {
private String name; private String ppt; private String video; private String homeWork; public String getName() {
return name; } public void setName(String name) {
this.name = name; } public String getPpt() {
return ppt; } public void setPpt(String ppt) {
this.ppt = ppt; } public String getVideo() {
return video; } public void setVideo(String video) {
this.video = video; } public String getHomeWork() {
return homeWork; } public void setHomeWork(String homeWork) {
this.homeWork = homeWork; } @Override public String toString() {
return "Course{" + "name='" + name + '\'' + ", ppt='" + ppt + '\'' + ", video='" + video + '\'' + ", homeWork='" + homeWork + '\'' + '}'; }}
public class CourseBuilder {
private Course course = new Course(); public void addName(String name){
course.setName(name); } public void addPpt(String ppt){
course.setPpt(ppt); } public void addVideo(String video){
course.setVideo(video); } public void addHomeWork(String homeWork){
course.setHomeWork(homeWork); } public Course builder(){
return course; }}
public class TestSimpleBuilder {
public static void main(String[] args) {
CourseBuilder builder = new CourseBuilder(); builder.addName("设计模式"); builder.addPpt("ppt"); builder.addVideo("录播"); builder.addHomeWork("work"); System.out.println(builder.builder()); }}
链式使用
public class Course {
private String name; private String ppt; private String video; private String homeWork; public String getName() {
return name; } public void setName(String name) {
this.name = name; } public String getPpt() {
return ppt; } public void setPpt(String ppt) {
this.ppt = ppt; } public String getVideo() {
return video; } public void setVideo(String video) {
this.video = video; } public String getHomeWork() {
return homeWork; } public void setHomeWork(String homeWork) {
this.homeWork = homeWork; } @Override public String toString() {
return "Course{" + "name='" + name + '\'' + ", ppt='" + ppt + '\'' + ", video='" + video + '\'' + ", homeWork='" + homeWork + '\'' + '}'; }}
public class CourseBuilder {
private Course course = new Course(); public CourseBuilder addName(String name){
course.setName(name); return this; } public CourseBuilder addPpt(String ppt){
course.setPpt(ppt); return this; } public CourseBuilder addVideo(String video){
course.setVideo(video); return this; } public CourseBuilder addHomeWork(String homeWork){
course.setHomeWork(homeWork); return this; } public Course builder(){
return course; }}
public class TestSimpleBuilder {
public static void main(String[] args) {
CourseBuilder builder = new CourseBuilder(); builder.addName("设计模式").addPpt("ppt").addVideo("录播").addHomeWork("work"); System.out.println(builder.builder()); }}

转载地址:http://dkjrn.baihongyu.com/

你可能感兴趣的文章
注意.NET Core进行请求转发问题
查看>>
别“躺”着了,赶紧把「复盘」做起来
查看>>
真正拖垮你的,是沉没成本
查看>>
Docker:恢复对开源项目的无限制访问
查看>>
Blazor 准备好为企业服务了吗?
查看>>
.NET5全面拥抱Azure云,微软市值重回巅峰,那些年吹过的牛,都实现了!
查看>>
C# 中的 ref 已经被放开,或许你已经不认识了
查看>>
C#刷剑指Offer | 【常考题】最小的k个数
查看>>
【专题】多角度深入解析开放原子开源基金会
查看>>
在 Azure App Service 上启用 Application Request Routing
查看>>
使用 Xunit.DependencyInjection 改造测试项目
查看>>
谈谈.NET Core IServiceProvider
查看>>
一个.NET Core下的开源插件框架Pluginfactory
查看>>
基于阿里云日志服务快速打造简版业务监控看板
查看>>
集赞有礼!进击吧! Blazor !第六期 企业内部应用建设实战
查看>>
大象起舞——微软研发如何保持创新力和敏捷性
查看>>
Newbe.ObjectVisitor 0.2.10 发布,更花里胡哨
查看>>
寻找性能更优秀的动态 Getter 和 Setter 方案
查看>>
跟我一起学.NetCore之EF Core 实战入门,一看就会
查看>>
.NET架构小技巧(8)——优待异常
查看>>