在Java编程语言中,设计模式是一种通用的解决问题的方案,它能帮助程序员提高软件的可维护性、可扩展性和可重用性。作为一名开发者,掌握常见的设计模式,不仅能提高代码质量,还能在面试中赢得高分,脱颖而出。因此,今天我们将通过几道Java设计模式的经典面试题和解答,帮助你系统化地理解这些设计模式。
1.什么是设计模式?
设计模式(DesignPattern)是一种经过多次实践验证的解决特定问题的方案,旨在提高代码的复用性、灵活性以及可维护性。它是面向对象设计的基础,旨在帮助开发者避免重复发明轮子,遵循“代码不重复”的原则。常见的设计模式有23种,分为三大类:创建型模式、结构型模式和行为型模式。
2.常见的设计模式有哪些?请简要描述它们的用途。
在Java编程中,设计模式通常分为以下三类:
创建型模式:主要关注对象的创建。常见的创建型设计模式包括:
单例模式(SingletonPattern):保证一个类只有一个实例,并提供全局访问点。
工厂模式(FactoryPattern):提供一个创建对象的接口,但不暴露具体的实现类。
抽象工厂模式(AbstractFactoryPattern):创建一系列相关的对象,而无需指定具体类。
建造者模式(BuilderPattern):使用多个简单的对象一步步构建成一个复杂的对象。
原型模式(PrototypePattern):通过***现有对象来创建新对象。
结构型模式:主要关注类和对象的组合。常见的结构型设计模式包括:
适配器模式(AdapterPattern):将一个类的接口转换成客户希望的另一个接口。
桥接模式(BridgePattern):将抽象部分与实现部分分离,使它们可以独立地变化。
组合模式(CompositePattern):将对象组合成树形结构来表示部分-整体的层次结构。
装饰器模式(DecoratorPattern):动态地给对象添加额外的功能。
外观模式(FacadePattern):为子系统提供一个统一的接口,使得子系统更易使用。
行为型模式:主要关注对象之间的交互。常见的行为型设计模式包括:
观察者模式(ObserverPattern):定义对象间的一对多依赖,当一个对象改变时,所有依赖它的对象都得到通知。
策略模式(StrategyPattern):定义一系列算法,将每一个算法封装起来,并使它们可以互换。
命令模式(CommandPattern):将请求封装为一个对象,从而让用户更灵活地使用不同的请求。
状态模式(StatePattern):允许一个对象在其内部状态改变时改变其行为。
模板方法模式(TemplateMethodPattern):定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现。
通过了解这些常见的设计模式,可以帮助我们在实际开发中应对各种复杂的系统需求,编写更加高效、易维护的代码。
3.单例模式是什么?如何实现?
单例模式(SingletonPattern)是一种创建型设计模式,保证一个类只有一个实例,并提供全局访问点。通常用于日志类、数据库连接池、线程池等场景,避免创建多个对象,节约资源。
实现方式:
懒汉式(线程不安全):
publicclassSingleton{
privatestaticSingletoninstance;
privateSingleton(){}
publicstaticSingletongetInstance(){
if(instance==null){
instance=newSingleton();
}
returninstance;
}
}
懒汉式(线程安全):
publicclassSingleton{
privatestaticSingletoninstance;
privateSingleton(){}
publicstaticsynchronizedSingletongetInstance(){
if(instance==null){
instance=newSingleton();
}
returninstance;
}
}
饿汉式(线程安全):
publicclassSingleton{
privatestaticfinalSingletoninstance=newSingleton();
privateSingleton(){}
publicstaticSingletongetInstance(){
returninstance;
}
}
双重检查锁定:
publicclassSingleton{
privatestaticvolatileSingletoninstance;
privateSingleton(){}
publicstaticSingletongetInstance(){
if(instance==null){
synchronized(Singleton.class){
if(instance==null){
instance=newSingleton();
}
}
}
returninstance;
}
}
4.工厂模式和抽象工厂模式的区别?
工厂模式(FactoryPattern):通过工厂方法来创建对象,但客户端并不需要了解对象的具体类。工厂方法通常返回一个对象的实例。
publicinterfaceProduct{
voiddoSomething();
}
publicclassConcreteProductimplementsProduct{
publicvoiddoSomething(){
System.out.println("Doingsomething...");
}
}
publicabstractclassCreator{
publicabstractProductfactoryMethod();
}
publicclassConcreteCreatorextendsCreator{
publicProductfactoryMethod(){
returnnewConcreteProduct();
}
}
抽象工厂模式(AbstractFactoryPattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体的类。抽象工厂是对多个工厂方法的组合,用于创建一系列产品。
publicinterfaceAbstractFactory{
ProductAcreateProductA();
ProductBcreateProductB();
}
publicclassConcreteFactory1implementsAbstractFactory{
publicProductAcreateProductA(){
returnnewProductA1();
}
publicProductBcreateProductB(){
returnnewProductB1();
}
}
5.什么是观察者模式?它的应用场景有哪些?
观察者模式(ObserverPattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动更新。常用于事件驱动系统中,比如GUI组件、消息推送系统等。
代码示例:
publicinterfaceObserver{
voidupdate(Stringmessage);
}
publicclassConcreteObserverimplementsObserver{
privateStringname;
publicConcreteObserver(Stringname){
this.name=name;
}
publicvoidupdate(Stringmessage){
System.out.println(name+"receivedmessage:"+message);
}
}
publicclassSubject{
privateListobservers=newArrayList<>();
publicvoidaddObserver(Observerobserver){
observers.add(observer);
}
publicvoidnotifyObservers(Stringmessage){
for(Observerobserver:observers){
observer.update(message);
}
}
}
应用场景:例如天气预报应用,当气象数据更新时,所有订阅的设备都可以收到通知并更新信息。