在本文中,我们将介绍工厂模式、单例模式和观察者模式这三种常见的设计模式,并探讨它们在软件开发中的应用和重要性。
工厂模式(Factory Pattern)工厂模式提供了一种创建对象的方式,将对象的实例化过程封装在工厂类中。它可以隐藏具体对象的创建细节,使得代码更加灵活和可扩展。
结构工厂模式由以下组成部分:

工厂模式适用于以下场景:
当一个类不知道它所需要的对象的确切类型时。当一个类希望由子类来指定所创建的对象时。当类将对象的创建职责委托给多个辅助子类中的某一个,并希望将哪一个辅助子类是代理者这一信息局部化时。示例// 抽象产品interface Product { void operation();}// 具体产品class ConcreteProduct implements Product { @Override public void operation() { System.out.println("具体产品执行操作"); }}// 抽象工厂interface Factory { Product createProduct();}// 具体工厂class ConcreteFactory implements Factory { @Override public Product createProduct() { return new ConcreteProduct(); }}// 客户端代码public class Main { public static void main(String[] args) { Factory factory = new ConcreteFactory(); Product product = factory.createProduct(); product.operation(); }}
单例模式(Singleton Pattern)
单例模式确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局共享资源或控制资源访问的情景。
结构单例模式由以下组成部分:
单例类(Singleton Class):负责创建自己的唯一实例,并提供全局访问点。私有构造函数(Private Constructor):确保其他类无法直接实例化单例类。静态变量(Static Variable):用于存储单例类的唯一实例。静态方法(Static Method):提供全局访问点,用于获取单例类的实例。应用场景单例模式适用于以下场景:
当需要在整个系统中共享一个实例,并且需要控制对该实例的访问时。当需要对资源进行集中管理,以避免资源的重复创建和浪费时。当需要确保只有一个实例存在,并且需要提供全局访问点时。示例// 单例类public class Singleton { private static Singleton instance; // 私有构造函数 private Singleton() { } // 静态方法,用于获取单例实例 public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } public void doSomething() { System.out.println("Singleton instance is doing something"); }}// 客户端代码public class Main { public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); singleton.doSomething(); }}
观察者模式(Observer Pattern)
观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。
结构观察者模式由以下组成部分:
抽象主题(Abstract Subject):定义了被观察的对象的接口,包含了添加、删除和通知观察者的方法。具体主题(Concrete Subject):实现抽象主题接口,维护观察者对象的状态,并在状态发生变化时通知观察者。抽象观察者(Abstract Observer):定义了观察者的接口,包含了接收通知并更新的方法。具体观察者(Concrete Observer):实现抽象观察者接口,用于接收主题对象的通知并更新自身状态。应用场景观察者模式适用于以下场景:
当一个对象的变化需要通知其他对象,并且这些对象之间的关系是一对多的关系时。当一个对象的改变需要同时改变其他对象的状态时。当一个对象需要在其他对象的状态发生变化时采取特定的行动时。示例// 抽象主题interface Subject { void attach(Observer observer); void detach(Observer observer); void notifyObservers();}// 具体主题class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); private String state; @Override public void attach(Observer observer) { observers.add(observer); } @Override public void detach(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(state); } } public void setState(String state) { this.state = state; notifyObservers(); }}// 抽象观察者 interface Observer { void update(String state); }// 具体观察者 class ConcreteObserver implements Observer { private String state; @Override public void update(String state) { this.state = state; System.out.println("Observer received state update: " + state); }}// 客户端代码 public class Main { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); Observer observer1 = new ConcreteObserver(); Observer observer2 = new ConcreteObserver(); subject.attach(observer1); subject.attach(observer2); subject.setState("New state"); }}
总结
设计模式是优化软件开发的艺术。工厂模式、单例模式和观察者模式是常见的设计模式之一,它们在软件开发中起到了重要的作用。
工厂模式通过封装对象的实例化过程,提供了一种灵活和可扩展的方式来创建对象。单例模式确保一个类只有一个实例,并提供了全局访问点,用于共享资源或控制资源访问。观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。通过学习和应用这些设计模式,我们可以改善软件的结构、可读性和可维护性,提高软件开发的效率和质量。
深入了解和掌握更多设计模式的概念和应用,将有助于我们成为更优秀的软件开发者。