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