设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,其中最出名的当属 Gang of Four (GoF) 的分类了,他们将设计模式分类为 23 种经典的模式,根据用途我们又可以分为三大类,分别为创建型模式、结构型模式和行为型模式。
本文目录导读:
在软件开发领域,设计模式是一种被广泛认可的解决问题的方法,它们是经过实践验证的经验总结,可以帮助开发者更好地解决软件设计中遇到的各种问题,作为一名评测编程专家,掌握设计模式对于提高自己的编程技能和项目质量具有重要意义,本文将介绍设计模式的基本概念、常见的设计模式及其应用场景,以及如何在实际项目中运用设计模式来优化代码结构和提高开发效率。
设计模式基本概念
设计模式是一种针对特定问题的通用可重复使用的解决方案,它们分为三大类:创建型模式、结构型模式和行为型模式。
1、创建型模式:主要用于处理对象的创建过程,包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。
2、结构型模式:主要用于处理对象之间的组合和协作关系,包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式。
3、行为型模式:主要用于处理对象之间的交互和通信,包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。
常见的设计模式及其应用场景
1、单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点,适用于需要频繁创建和销毁的对象,如数据库连接池、日志记录器等。
public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
2、工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类,适用于需要根据不同条件创建不同类型对象的场景。
public interface Shape { void draw(); } public class Circle implements Shape { @Override public void draw() { System.out.println("Draw a circle"); } } public class ShapeFactory { public Shape getShape(String shapeType) { if (shapeType == null) { return null; } else if (shapeType.equalsIgnoreCase("CIRCLE")) { return new Circle(); } return null; } }
3、观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新,适用于事件驱动的系统,如用户界面、实时数据更新等。
import java.util.ArrayList; import java.util.List; interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } interface DataObserver extends java.util.Observable { void update(); }
4、策略模式(Strategy):定义一系列算法,将每个算法封装起来,并使它们可以相互替换,适用于需要根据不同条件选择不同算法的场景。
// Strategy interface for encryption/decryption operations. The actual implementation will be in the concrete classes implementing this interface. public interface Strategy { int encrypt(int number); // returns encrypted number after applying the strategy or throws an exception if it cannot encrypt the number. This is just a sample method. You can add more methods as per your requirements. The actual logic of encryption/decryption should be implemented in the concrete classes implementing this interface. These classes should implement the Strategy interface itself and provide their own implementation of the encrypt() method. The factory class should return object of appropriate Strategy class based on some criteria like algorithm to use etc. For example: return new DESStrategy(); or return new BlowfishStrategy(); based on some user input or configuration setting. The factory class should follow the singleton pattern so that only one Strategy object exists in the application context and the same Strategy object is returned by the factory whenever any client requests for it.