揭秘设计模式之建造者模式
Posted 醉酒的小男人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了揭秘设计模式之建造者模式相关的知识,希望对你有一定的参考价值。
个人理解
看了网上的解释,感觉有一个还挺好理解的案例,和生活挺贴切,自己想了个更贴切的。比如:电商网站最近搞了一个促销活动8月8女王节,促销产生包括卫生纸、牙膏、私人玩具娃娃你知道的、面膜、假毛贴、白粉模脸的、指甲油、眼影、剃须刀、小玩具等等。促销产品是固定的。但是它可以组装N种购买套餐,任意灵活组装3件合成套餐向用户提供购买选项。
什么是建造者模式
是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。属于创建型模式。比如JDK中的StringBuilder,Mybatis中的CacheBuilder、SqlSessionFactoryBuilder,Spring中的BeanDefinitionBuilder。
模式讲解:
1.指挥者(Director)直接和客户(Client)进行需求沟通;
2.沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
3.将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
4.各个具体建造者负责进行产品部件的构建;
5.最终构建成具体产品(Product)
代码案例
产品类
package com;
/**
* 产品
*/
public class Project {
private String demand;
private String framework;
private String outline;
private String test;
public String getDemand() {
return demand;
}
public void setDemand(String demand) {
this.demand = demand;
}
public String getFramework() {
return framework;
}
public void setFramework(String framework) {
this.framework = framework;
}
public String getOutline() {
return outline;
}
public void setOutline(String outline) {
this.outline = outline;
}
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
@Override
public String toString() {
return "Project{" +
"demand='" + demand + '\\'' +
", framework='" + framework + '\\'' +
", outline='" + outline + '\\'' +
", test='" + test + '\\'' +
'}';
}
}
抽象建造类
package com;
/**
* 抽象建造类
*/
public abstract class Builder {
protected Project project = new Project();
/**
* 需求分析
*/
public abstract Builder demand();
/**
* 架构设计
*/
public abstract Builder framework();
/**
* 概要设计
*/
public abstract Builder outline();
/**
* 集成测试
*/
public abstract Builder test();
/**
* 得到产品
* @return
*/
public Project getProject(){
return project;
}
}
具体建造者
package com;
/**
* 具体建造者
*/
public class ERPConcreteBuilder extends Builder{
@Override
public Builder demand() {
project.setDemand("ERP 需求阶段...");
System.out.println("ERP 需求阶段...");
return this;
}
@Override
public Builder framework() {
project.setFramework("ERP 架构设计阶段...");
System.out.println("ERP 架构设计阶段...");
return this;
}
@Override
public Builder outline() {
project.setOutline("ERP 概要设计阶段...");
System.out.println("ERP 概要设计阶段...");
return this;
}
@Override
public Builder test() {
project.setTest("ERP 集成测试阶段...");
System.out.println("ERP 集成测试阶段...");
return this;
}
@Override
public Project getProject() {
return super.getProject();
}
}
具体建造者ExamSystemConcreteBuilder
package com;
/**
* 具体建造者
*/
public class ExamSystemConcreteBuilder extends Builder{
@Override
public Builder demand() {
project.setDemand("考试系统 需求阶段...");
System.out.println("考试系统 需求阶段...");
return this;
}
@Override
public Builder framework() {
project.setFramework("考试系统 架构设计阶段...");
System.out.println("考试系统 架构设计阶段...");
return this;
}
@Override
public Builder outline() {
project.setOutline("考试系统 概要设计阶段...");
System.out.println("考试系统 概要设计阶段...");
return this;
}
@Override
public Builder test() {
project.setTest("考试系统 集成测试阶段...");
System.out.println("考试系统 集成测试阶段...");
return this;
}
@Override
public Project getProject() {
return super.getProject();
}
}
指挥者
package com;
/**
* 指挥者
*/
public class Director {
public void ERPBuild(){
Builder builder = new ERPConcreteBuilder();
Project project = builder.demand().framework().outline().test().getProject();
System.out.println(project);
}
public void ExamSystemBuild(){
Builder builder = new ExamSystemConcreteBuilder();
Project project = builder.demand().framework().outline().test().getProject();
System.out.println(project);
}
}
测试类
package com;
public class BuilderTest {
public static void main(String[] args) {
Director director = new Director();
director.ERPBuild();
director.ExamSystemBuild();
}
}
结果
以上是关于揭秘设计模式之建造者模式的主要内容,如果未能解决你的问题,请参考以下文章