设计模式是软件工程中的一种解决方案,用于应对常见的设计问题和挑战。它们提供了一种标准化的方式来解决设计难题,使代码更加灵活、可扩展和易于维护。
单例模式(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");}
}
设计模式是软件开发中的重要工具,能够显著提高代码的可维护性、灵活性和可扩展性。掌握这些模式并灵活应用,可以帮助开发者更好地设计和构建高质量的软件系统。
黑马程序员免费预约咨询