本文所有案例代码
码云:https://gitee.com/helloworld6379/designPattern
Github:Github地址
设计模式概述
1 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通
用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的
一段时间的试验和错误总结出来的。
2 设计模式的本质提高 软件的维护性,通用性和扩展性,并降低软件的复杂度。
3 设计模式并不局限于某种语言,java,php,c++ 都有设计模式.
设计模式类型
设计模式分为三种类型,共 23 种
1 创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
2 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
3 行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter 模式)、状态模式、策略模式、职责链模式(责任链模式)。
不同的资料上对分类和名称略有差别
建造者模式
建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出 来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们, 用户不需要知道内部的具体构建细节。
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
建造者模式的四个角色
- Product(产品角色): 一个具体的产品对象。
- Builder(抽象建造者): 创建一个 Product 对象的各个部件指定的 接口/抽象类。
- ConcreteBuilder(具体建造者): 实现接口,构建和装配各个部件。
- Director(指挥者): 构建一个使用 Builder 接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作 用,一是隔离了客户与对象的生产过程,二是负责控制产品对象的生产过程。
需求:
每个笔记本电脑都有CPU,内存和硬盘。
根据不同的CPU,内存和硬盘组合不同的电脑。
这里的Product就是Computer
Builder就是ComputerBuilder
ConcreteBuilder就是ThinkPadBuilder 和HaseeBuilder
UML图:
public class Computer {
private String cpu;
private String ram;
private String hdd;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getRam() {
return ram;
}
public void setRam(String ram) {
this.ram = ram;
}
public String getHdd() {
return hdd;
}
public void setHdd(String hdd) {
this.hdd = hdd;
}
public void showInfo(){
System.out.println(this.toString());
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", ram='" + ram + '\'' +
", hdd='" + hdd + '\'' +
'}';
}
}
public interface ComputerBuilder {
public void buildCpu();
public void buildRam();
public void buildHdd();
public Computer buildComputer();
}
public class Director {
private ComputerBuilder builder;
public Director(ComputerBuilder builder){
this.builder = builder;
}
public Computer construct(){
builder.buildCpu();
builder.buildRam();
builder.buildHdd();
return builder.buildComputer();
}
}
public class ThinkPadBuilder implements ComputerBuilder {
private Computer computer;
public ThinkPadBuilder(){
computer = new Computer();
}
@Override
public void buildCpu() {
computer.setCpu("Inter U系列");
}
@Override
public void buildRam() {
computer.setRam("三星8G");
}
@Override
public void buildHdd() {
computer.setHdd("希捷500G");
}
@Override
public Computer buildComputer() {
return computer;
}
}
public class HaseeBuilder implements ComputerBuilder {
private Computer computer;
public HaseeBuilder(){
computer = new Computer();
}
@Override
public void buildCpu() {
computer.setCpu("Inter H系列");
}
@Override
public void buildRam() {
computer.setRam("金士顿16G");
}
@Override
public void buildHdd() {
computer.setHdd("希捷1T");
}
@Override
public Computer buildComputer() {
return computer;
}
}
public class BulidTest {
public static void main(String[] args) {
ComputerBuilder builder = new HaseeBuilder();
Director director = new Director(builder);
Computer computer = director.construct();
computer.showInfo();
}
}
建造者模式在 JDK 的应用
解析:
1 Appendable 接口定义了多个 append 方法(抽象方法), 即 Appendable 为抽象建造者, 定义了抽象方法。
2 AbstractStringBuilder 实现了 Appendable 接口方法,这里的 AbstractStringBuilder 已经是建造者,只是不能实例化 。
3 StringBuilder 即充当了指挥者角色,同时充当了具体的建造者,建造方法的实现是由 AbstractStringBuilder完成, 而 StringBuilder 继承了AbstractStringBuilder。
抽象工厂模式 VS 建造者模式
抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采 用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。而建造者模式则是要求按照指定 的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品