软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理
一、简介
将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。例如:电脑是显示器、键盘、鼠标等等组成使用的,但客户只需购买就可以了,无需关注产品内部组成的细节。
- Product:最终要生成的对象,例如 Computer实例。
- Builder:构建者的抽象基类(有时会使用接口代替)。其定义了构建Product的抽象步骤,其实体类需要实现这些步骤。其会包含一个用来返回最终产品的方法Product getProduct()。
- ConcreteBuilder:Builder的实现类。
- Director:决定如何构建最终产品的算法. 其会包含一个负责组装的方法void Construct(Builder builder), 在这个方法中通过调用builder的方法,就可以设置builder,等设置完成后,就可以通过builder的 getProduct() 方法获得最终的产品。
二、实例
1、电脑标准规范类(PC)
public class PC {
private String keyboard;//键盘
private String mouse;//鼠标
private String monitor;//显示器
private String master;//主机
public PC(String keyboard, String mouse) {
this.keyboard = mouse;
this.mouse = mouse;
}
public void setMonitor(String monitor) {
this.monitor = monitor;
}
public void setMaster(String master) {
this.master = master;
}
@Override
public String toString() {
return "PC{" +
"keyboard='" + keyboard + '\'' +
", mouse='" + mouse + '\'' +
", monitor='" + monitor + '\'' +
", master='" + master + '\'' +
'}';
}
}
2、抽象构建者类(PCBuilder)
public abstract class PCBuilder {
public abstract void setMonitor();
public abstract void setMaster();
public abstract PC getPC();
}
3、苹果电脑构建者类(MacPCBuilder)
public class MacPCBuilder extends PCBuilder {
private PC pc;
public MacPCBuilder(String keyboard, String mouse) {
pc = new PC(keyboard, mouse);
}
@Override
public void setMonitor() {
pc.setMonitor("苹果显示器");
}
@Override
public void setMaster() {
pc.setMaster("苹果主机");
}
@Override
public PC getPC() {
return pc;
}
}
4、小米电脑构建者类(MiPCBuilder)
public class MiPCBuilder extends PCBuilder {
private PC pc;
public MiPCBuilder(String keyboard, String mouse) {
pc = new PC(keyboard, mouse);
}
@Override
public void setMonitor() {
pc.setMonitor("小米显示器");
}
@Override
public void setMaster() {
pc.setMaster("小米主机");
}
@Override
public PC getPC() {
return pc;
}
}
5、指导者类(PCDirector)
public class PCDirector {
public void makePC(PCBuilder builder) {
builder.setMonitor();
builder.setMaster();
}
}
6、测试类
public class Main {
public static void main(String[] args) {
PCDirector director = new PCDirector();
PCBuilder builder = new MacPCBuilder("德国樱桃键盘", "罗技鼠标");
director.makePC(builder);
PC macPC = builder.getPC();
System.out.println("mac pc:" + macPC.toString());
PCBuilder miPCBuilder = new MiPCBuilder("ikbc键盘", "雷柏鼠标");
director.makePC(miPCBuilder);
PC miPC = miPCBuilder.getPC();
System.out.println("mi pc:" + miPC.toString());
}
}
控制台输出:
mac pc:PC{keyboard='罗技鼠标', mouse='罗技鼠标', monitor='苹果显示器', master='苹果主机'}
mi pc:PC{keyboard='雷柏鼠标', mouse='雷柏鼠标', monitor='小米显示器', master='小米主机'}
三、总结
1、优点
- 建造者独立,易扩展。
- 便于控制细节风险。
2、缺点
- 产品必须有共同点,范围有限制。
- 如内部变化复杂,会有很多的建造类。
3、应用场景
- 需要生成的对象具有复杂的内部结构。
- 需要生成的对象内部属性本身相互依赖。