Java中有23种设计模式,主要分为三类:创建型模式、结构型模式和行为型模式。
创建型模式
创建型模式关注于对象的创建,提供了更灵活的对象创建方式。主要包括以下几种:
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
工厂模式:包括简单工厂、工厂方法模式和抽象工厂模式。
建造者模式:通过多个简单的对象逐步构建成一个复杂的对象。
原型模式:通过复制现有的实例来创建新对象。
抽象工厂模式:创建相关或相互依赖的对象家族,而不需要明确指定具体类。
结构型模式
结构型模式涉及对象/类之间的关系,主要包括以下几种:
适配器模式:将一个类的接口转换成客户端希望的另一个接口。
装饰器模式:动态地给一个对象添加一些额外的职责。
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
外观模式:提供一个统一的接口,用来访问子系统中的一群接口。
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
组合模式:将对象组合成树形结构以表示部分-整体层次结构。
享元模式:通过共享已经创建的对象来减少内存使用和提高效率。
行为型模式
行为型模式涉及对象/类的行为、状态、流程,主要包括以下几种:
策略模式:定义一系列算法,并将每一个算法封装起来,使它们可以相互替换。
模板方法模式:定义一个操作中的算法的骨架,将算法的一些步骤延迟到子类中。
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
迭代子模式:提供一种方法顺序访问一个聚合对象中各个元素, 而又无需暴露该对象的内部表示。
责任链模式:将请求发送到多个对象中的一个,这些对象共享响应职责。
命令模式:将一个请求或者操作封装到一个对象中。
备忘录模式:在不破坏封装的前提下,捕获和恢复对象的状态。
状态模式:允许一个对象在其内部状态改变时改变它的行为。
访问者模式:在不修改集合元素的前提下,为集合中的每个元素操作提供一个访问接口。
中介者模式:用一个中介对象来封装一系列的对象交互。
解释器模式:提供一个简单的语法分析机制,用于解释和执行字符串表达式。
面试题解析
-
什么是建造者模式?
答案:建造者模式是一种创建型设计模式,它允许你创建复杂对象的步骤独立于对象本身。在Java中,建造者模式由一个包含多个方法的Builder类和一个需要构建的复杂对象类组成。Builder类负责设置复杂对象的各个部分,而复杂对象类则负责实际构建对象。 -
请解释建造者模式的主要角色及其职责。
答案:
- 抽象建造者(Builder):定义产品创建的接口,声明一系列构建和装配产品部件的方法。
- 具体建造者(ConcreteBuilder):实现抽象建造者接口,完成具体产品部件的构建和装配。
- 指挥者(Director):负责安排产品部件的构建顺序,最终调用具体建造者的装配方法来生成产品对象。
- 产品(Product):表示被构建的复杂对象,包含多个部件。
- 客户端(Client):负责创建具体建造者和指挥者对象,并指导产品的构建过程。
-
建造者模式与工厂模式有什么区别?
答案:工厂模式的主要目的是创建一个产品族中的对象,而不需要明确指定具体类。而建造者模式的主要目的是创建一个复杂对象,这个对象由多个部分组成,并且这些部分可以有不同的表示。工厂模式通常通过静态方法或工厂类来创建对象,而建造者模式则通过逐步构建的方式来创建复杂对象。 -
为什么使用建造者模式?
答案:使用建造者模式可以在创建复杂对象时提供更好的灵活性和解耦。它允许客户端通过指定不同的建造者来创建不同类型的产品,同时可以将产品的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。 -
请举例说明如何使用建造者模式来解决实际问题?
答案:例如,在构建一个计算机时,可以使用建造者模式来分别构建CPU、内存、硬盘等部件,最后组装成一台完整的计算机。这样可以灵活地选择不同品牌和型号的部件来构建不同配置的计算机。 -
在Java中如何实现一个基本的建造者模式?
答案:以下是一个基本的建造者模式的实现示例:
// 抽象建造者
public abstract class ComputerBuilder {
protected Computer computer;
public ComputerBuilder() {
computer = new Computer();
}
public abstract void buildCPU();
public abstract void buildRAM();
public abstract void buildHardDrive();
public Computer getComputer() {
return computer;
}
}
// 具体建造者
public class GamingPCBuilder extends ComputerBuilder {
@Override
public void buildCPU() {
computer.setCPU("Intel i9");
}
@Override
public void buildRAM() {
computer.setRAM("32GB");
}
@Override
public void buildHardDrive() {
computer.setHardDrive("1TB SSD");
}
}
// 产品
public class Computer {
private String CPU;
private String RAM;
private String hardDrive;
// Getter 和 Setter 略
}
// 客户端
public class Main {
public static void main(String[] args) {
ComputerBuilder builder = new GamingPCBuilder();
builder.buildCPU();
builder.buildRAM();
builder.buildHardDrive();
Computer gamingPC = builder.getComputer();
// 使用gamingPC
}
}
-
建造者模式有哪些优点和缺点?
答案:优点包括解耦构建和表示、提高代码的可读性和可维护性、可以更精细地控制产品的创建过程。缺点是会增加系统的复杂度和额外的类数量。 -
在建造者模式中,如果需要返回一个原型实例而不是新建一个实例,应该使用哪种设计模式?
答案:应该使用原型模式(Prototype Pattern)。原型模式允许通过复制现有的实例来创建新的对象,而不是通过初始化新的对象。这可以通过实现Cloneable接口或使用拷贝构造函数来实现。然而需要注意的是,并非所有语言都原生支持克隆操作,且深拷贝可能比较复杂。 -
请解释一下建造者模式中的“导演者”的作用是什么?
答案:“导演者”(Director)的作用是负责安排产品部件的构建顺序并最终生成产品对象它不涉及具体产品的信息只负责保证对象各部分完整创建或按某种顺序创建它通过调用具体建造者的方法来分步构建产品从而将构建过程封装起来使得客户端无需关心具体的构建细节只需知道如何请求特定的产品即可。 -
建造者模式适用于哪些场景?举几个例子说明其应用场景。
答案:建造者模式适用于创建过程复杂、步骤繁多、参数较多且需要灵活控制的产品对象的场景。例如:
- 构建复杂的实体类如计算机、汽车等每个部件都有多种选择和组合方式;
- 构建图形用户界面(GUI)窗体应用程序中的窗体可能包含多个控件和布局需要逐步添加和设置;
- 构建测试环境或集成环境需要根据不同的需求配置不同的组件和服务;
- 构建数据库查询动态生成SQL语句根据不同的条件组合查询条件和字段;
- 构建游戏角色或关卡每个角色或关卡可能包含多个属性和行为需要逐步定义和配置。
735

被折叠的 条评论
为什么被折叠?



