1.建造者模式概念
定义:
将一个复杂的对象构建与其表示相分离,使得同样的构建过程可以创建不同的表示;
核心:构建与表示分离,同构建不同表示
区别于抽象工厂模式:
(1)与抽象工厂模式相似,因为它也可以创建复杂对象。主要的区别是建造者模式着重于一步步构造一个复杂对象,关注的是零件类型和装配工艺的顺序。而抽象工厂模式着重于多个系列的产品对象(简单的或是复杂的)。建造者模式在最后的一步返回产品,而对于抽象工厂来说,产品是立即返回的。
(2)
在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。
它的角色:
1.抽象建造者(Builder)角色:该角色
是用于规范产品的各个组成部分,并进行抽象,一般独立于应用程序的逻辑。
2.具体建造者( ConcreteBuilder)角色:
该
角色实现出抽象建造者中定义的所有方法,并且返回一个组建好的产品实例。
3.产品(Product)角色:
该角色是建造中的复杂对象,一个系统中会有多于一个的产品类,这些产品并不一定有公共的接口,完全可以是不相关联的。
4.指导者(Director)角色:
该角色负责安排已有的模块的顺序,然后告诉建造者
Builder开始建造。
还是那句话实例比理论来到更直白,最好看一下UML图先。这里用一个笔记本电脑建造的实例吧,可能代码有点多,给点耐心。
2.UML图
3.具体代码
(1)抽象建造者角色:ComputerBuilder接口
public interface ComputerBuilder {
void builderCpu();//建造cpu
void builderRam();//建造内存
void builderOs();//建造操作系统
void builderOverturn360();//建造翻转
// 更多代码逻辑.....
Computer getResult();//得到建造好的笔记本
}
(2)具体建造者角色:
具体建造者Y5070Builder类和YOGA4ProBuilder类实现
ComputerBuilder
,用于创建相应的笔记本产品对象。
Y5070Builder类:
public class Y5070Builder implements ComputerBuilder {
private Y5070 computer=new Y5070();
@Override
public void builderCpu() {
computer.setCpu("i7-4720HQ");
}
@Override
public void builderRam() {
computer.setRam("8GB ");
}
@Override
public void builderOs() {
computer.setOs("Windows 10 家庭版 ");
}
@Override
public void builderOverturn360() {
// 无翻转
}
@Override
public Y5070 getResult() {
// TODO Auto-generated method stub
return computer;
}
}
YOGA4ProBuilder类:
public class YOGA4ProBuilder implements ComputerBuilder {
private YOGA4Pro computer=new YOGA4Pro();
@Override
public void builderCpu() {
computer.setCpu("i5-6200U");
}
@Override
public void builderRam() {
computer.setRam("4GB");
}
@Override
public void builderOs() {
computer.setOs("Windows 10 家庭版");
}
public void builderOverturn360(){
computer.setOverturn360("可以360度翻转");
}
@Override
public YOGA4Pro getResult() {
return computer;
}
}
两种型号的笔记本的内部结构不同,YOGA4Pro可以360度翻转,而Y5070不可以,所以Y5070中没有Overturn360这个属性。
(3)产品角色:Computer抽象类
get和set方法这里就不写了,偷懒。public abstract class Computer {
private String type;//型号
private String cpu;//cpu
private String ram;//内存
private String os;//操作系统
//set和get方法
........
}
Y5070产品类:
public class Y5070 extends Computer {
//型号Y50-70笔记本
public Y5070(){
this.setType("Y50-70");
}
@Override
public String toString() {
return "\n型号:\t" + this.getType()
+ "\ncpu:\t" + this.getCpu()
+ "\n内存:\t" + this.getRam() + "\n操作系统:\t" + this.getOs()
;
}
}
YOGA4Pro产品类:
public class YOGA4Pro extends Computer {
//型号YOGA 4 Pro笔记本
private String overturn360;//360度翻转,特定属性
public YOGA4Pro(){
this.setType("YOGA 4 Pro");
}
public String getOverturn360() {
return overturn360;
}
public void setOverturn360(String overturn) {
this.overturn360 = overturn;
}
@Override
public String toString() {
return "\n型号:\t" + this.getType()
+ "\ncpu:\t" + this.getCpu()
+ "\n内存:\t" + this.getRam() + "\n操作系统:\t" + this.getOs()
+"\n360度翻转:\t"+this.getOverturn360();
}
}
(3)指导者角色:ComputerDirector类
指导笔记本电脑的生产。
public class ComputerDirector {
//指导者
ComputerBuilder builder; //建造者
//构造Y5070笔记本
public Y5070 constructY5070(){
builder=new Y5070Builder();
builder.builderCpu();
builder.builderRam();
builder.builderOs();
return (Y5070) builder.getResult();
}
//构造YOGA4Pro笔记本
public YOGA4Pro constructYoga4Pro(){
builder=new YOGA4ProBuilder();
builder.builderCpu();
builder.builderRam();
builder.builderOs();
builder.builderOverturn360();
return (YOGA4Pro) builder.getResult();
}
}
(4)测试类:
public class ClientBuilderPattern {
public static void main(String[] args) {
//调用者
ComputerDirector director=new ComputerDirector();
//实例化笔记本
Computer yoga4Pro=director.constructYoga4Pro();
Computer y5070=director.constructY5070();
//输出笔记本的信息
System.out.println(yoga4Pro.toString());
System.out.println(y5070.toString());
}
}
测试结果:
型号:
YOGA 4 Pro
cpu: i5-6200U
内存: 4GB
操作系统: Windows 10 家庭版
360度翻转: 可以360度翻转
型号: Y50-70
cpu: i7-4720HQ
内存: 8GB
操作系统: Windows 10 家庭版
cpu: i5-6200U
内存: 4GB
操作系统: Windows 10 家庭版
360度翻转: 可以360度翻转
型号: Y50-70
cpu: i7-4720HQ
内存: 8GB
操作系统: Windows 10 家庭版
4.小结
优点:
1.可以让你改变产品的内部表示。
2.封装建筑和代表性的代码。
3.提供超过施工工艺的步骤的控制。
2.封装建筑和代表性的代码。
3.提供超过施工工艺的步骤的控制。
缺点:
1.需要创造各种不同类型的产品单独ConcreteBuilder。
使用场景:
1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2 当构造过程必须允许被构造的对象有不同表示时(相同的方法,不同的执行顺序,产生不同的结果时)。
很 感谢你能看到这里,以上都是自己的总结,自己能力有限,可能有不对的,希望大家提出。
总结的不好,希望可以吐槽!