欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > Java常用的设计模式,如单例模式、工厂模式、观察者模式等

Java常用的设计模式,如单例模式、工厂模式、观察者模式等

2024/10/24 22:30:17 来源:https://blog.csdn.net/Itmastergo/article/details/139645924  浏览:    关键词:Java常用的设计模式,如单例模式、工厂模式、观察者模式等

设计模式是软件工程中的一种解决方案,用于应对常见的设计问题和挑战。它们提供了一种标准化的方式来解决设计难题,使代码更加灵活、可扩展和易于维护。

单例模式(Singleton Pattern)

概述

单例模式确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。这在需要全局共享资源时非常有用,例如数据库连接池、配置管理器等。

实现

在Java中,实现单例模式有多种方式,以下是最常见的几种:

饿汉式(Eager Initialization)
public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {// 私有构造函数,防止实例化}public static Singleton getInstance() {return instance;}
}

这种方法在类加载时就创建实例,线程安全,但如果实例过大且未被使用,会浪费资源。

懒汉式(Lazy Initialization)
public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数,防止实例化}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

这种方法在第一次调用时才创建实例,节省资源,但需要同步以确保线程安全。

双重检查锁(Double-Checked Locking)
public class Singleton {private static volatile Singleton instance;private Singleton() {// 私有构造函数,防止实例化}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

这种方法结合了懒汉式的延迟加载和线程安全的优点。

静态内部类(Static Inner Class)
public class Singleton {private Singleton() {// 私有构造函数,防止实例化}private static class Holder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return Holder.INSTANCE;}
}

这种方法利用类加载机制实现延迟加载,且线程安全。

工厂模式(Factory Pattern)

概述

工厂模式通过创建一个工厂类来处理对象的创建,提供了一种将实例化逻辑与使用逻辑分离的方式。常见的工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式。

实现
简单工厂模式(Simple Factory Pattern)
public class SimpleFactory {public Product createProduct(String type) {if (type.equals("A")) {return new ProductA();} else if (type.equals("B")) {return new ProductB();}return null;}
}

这种方法通过一个工厂类创建不同类型的产品实例。

工厂方法模式(Factory Method Pattern)
public interface Product {void use();
}public class ProductA implements Product {public void use() {System.out.println("Using Product A");}
}public class ProductB implements Product {public void use() {System.out.println("Using Product B");}
}public abstract class Factory {public abstract Product createProduct();
}public class FactoryA extends Factory {public Product createProduct() {return new ProductA();}
}public class FactoryB extends Factory {public Product createProduct() {return new ProductB();}
}

这种方法通过定义一个抽象工厂接口和具体工厂类,提供了灵活的产品创建方式。

抽象工厂模式(Abstract Factory Pattern)
public interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}public class ConcreteFactory1 implements AbstractFactory {public ProductA createProductA() {return new ProductA1();}public ProductB createProductB() {return new ProductB1();}
}public class ConcreteFactory2 implements AbstractFactory {public ProductA createProductA() {return new ProductA2();}public ProductB createProductB() {return new ProductB2();}
}

这种方法提供了创建一系列相关或依赖对象的接口,而无需指定它们的具体类。

观察者模式(Observer Pattern)

概述

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它会通知所有观察者,使它们能够自动更新。

实现
import java.util.ArrayList;
import java.util.List;public interface Observer {void update(String message);
}public class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}public void update(String message) {System.out.println(name + " received message: " + message);}
}public interface Subject {void attach(Observer observer);void detach(Observer observer);void notifyObservers();
}public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private String message;public void attach(Observer observer) {observers.add(observer);}public void detach(Observer observer) {observers.remove(observer);}public void notifyObservers() {for (Observer observer : observers) {observer.update(message);}}public void setMessage(String message) {this.message = message;notifyObservers();}
}

这种方法通过定义主题和观察者接口,确保观察者可以被通知到主题的任何变化。

其他常见设计模式

适配器模式(Adapter Pattern)

适配器模式将一个类的接口转换成客户希望的另一个接口,使原本接口不兼容的类可以一起工作。

public interface Target {void request();
}public class Adaptee {public void specificRequest() {System.out.println("Specific request");}
}public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}public void request() {adaptee.specificRequest();}
}
装饰器模式(Decorator Pattern)

装饰器模式动态地给对象添加一些额外的职责。相比生成子类,更加灵活。

public interface Component {void operation();
}public class ConcreteComponent implements Component {public void operation() {System.out.println("ConcreteComponent operation");}
}public abstract class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}public void operation() {component.operation();}
}public class ConcreteDecorator extends Decorator {public ConcreteDecorator(Component component) {super(component);}public void operation() {super.operation();additionalOperation();}private void additionalOperation() {System.out.println("Additional operation");}
}
策略模式(Strategy Pattern)

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,客户端可以选择不同的算法实现。

public interface Strategy {void execute();
}public class ConcreteStrategyA implements Strategy {public void execute() {System.out.println("Strategy A executed");}
}public class ConcreteStrategyB implements Strategy {public void execute() {System.out.println("Strategy B executed");}
}public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
}
外观模式(Facade Pattern)

外观模式为一组复杂的子系统提供一个更高级的统一接口,使子系统更容易使用。

public class SubsystemA {public void operationA() {System.out.println("Subsystem A operation");}
}public class SubsystemB {public void operationB() {System.out.println("Subsystem B operation");}
}public class Facade {private SubsystemA subsystemA;private SubsystemB subsystemB;public Facade() {subsystemA = new SubsystemA();subsystemB = new SubsystemB();}public void operation() {subsystemA.operationA();subsystemB.operationB();}
}
模板方法模式(Template Method Pattern)

模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中实现,使得子类可以不改变算法结构的情况下重新定义算法的某些步骤。

public abstract class AbstractClass {public final void templateMethod() {primitiveOperation1();primitiveOperation2();concreteOperation();}protected abstract void primitiveOperation1();protected abstract void primitiveOperation2();private void concreteOperation() {System.out.println("Concrete operation");}
}public class ConcreteClass extends AbstractClass {protected void primitiveOperation1() {System.out.println("Primitive operation 1");}protected void primitiveOperation2() {System.out.println("Primitive operation 2");}
}

设计模式是软件开发中的重要工具,能够显著提高代码的可维护性、灵活性和可扩展性。掌握这些模式并灵活应用,可以帮助开发者更好地设计和构建高质量的软件系统。

黑马程序员免费预约咨询

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com