赞
踩
创建型设计模式,共5种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
结构型设计模式,共7种:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型设计模式,共11种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
创建型设计模式,顾名思义就是与对象创建有关,它包括单例模式、工厂方法模式、抽象工厂模式、
建造者模式、原型模式。
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}
public class Singleton{
private static Singleton instance;
private Singleton(){
}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
public class Singleton{
private static Singleton instance;
private Singleton(){
}
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
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; } }
public class Singleton{
private Singleton(){
}
public static Singleton getInstance getInstance() {
return SingletonHolder.sInstance;
}
private static class SingletonHolder {
private staic final Singleton sInstance = new Singleton();
}
}
第一次加载Singleton类时并不会初始化sInstance,只有第一次调用getInstance方法时虚拟机加载 SingletonHolder 并初始化 sInstance。这样不仅能确保线程安全,也能保证 Singleton 类的唯一性。
所以,推荐使用静态内部类单例模式。
public enum Singleton {
INSTANCE;
public void doSomeThing() {
}
}
默认枚举实例的创建是线程安全的,并且在任何情况下都是单例。
在上面讲的几种单例模式实现中,有一种情况下其会重新创建对象,那就是反序列化:将一个单例实例对象写到磁盘再读回来,从而获得了一个实例。反序列化操作提供了readResolve方法,这个方法可以让开发人员控制对象的反序列化。在上述几个方法示例中,如果要杜绝单例对象被反序列化时重新生成对象,就必须加入如下方法:
private Object readResolve() throws ObjectStreamException {
return singleton;
}
在一个系统中,要求一个类有且仅有一个对象,它的具体使用场景如下:
• 整个项目需要一个共享访问点或共享数据。
• 创建一个对象需要耗费的资源过多,比如访问I/O或者数据库等资源。
• 工具类对象。
简单工厂模式(又叫作静态工厂方法模式),其属于创建型设计模式,但是并不属于 23种GoF设计模式之一。
定义:简单工厂模式属于创建型模式,其又被称为静态工厂方法模式,这是由一个工厂对象决定创建出哪一种产品类的实例。
Factory:工厂类,这是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
IProduct:抽象产品类,这是简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
Product:具体产品类,这是简单工厂模式的创建目标。
结构型设计模式是从程序的结构上解决模块之间的耦合问题,它包括适配器模式、代理模式、装饰模式、外观模式、桥接模式、组合模式和享元模式。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H3WYyJcq-1628430944333)(C:/Users/wei/AppData/Roaming/Typora/typora-user-images/image-20210501135307568.png)]
行为型模式主要处理类或对象如何交互及如何分配职责。它共有11种模式:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式和解释器模式。
在软件开发中,有时会遇到类似的情况:某个方法的实现需要多个步骤,其中有些步骤是固定的;而有些步骤并不固定,存在可变性。为了提高代码的复用性和系统的灵活性,可以使用模板方法模式来应对这类情况。
定义:定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类不改变一个算法的结构即可重定义算法的某些特定步骤。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LCyHNxZF-1628430944343)(C:/Users/wei/AppData/Roaming/Typora/typora-user-images/image-20210501143659054.png)]
使用场景:
多个子类有共有的方法,并且逻辑基本相同时。
面对重要、复杂的算法,可以把核心算法设计为模板方法,周边相关细节功能则由各个子类实现。
需要通过子类来决定父类算法中的某个步骤是否执行,实现子类对父类的反向控制。
• 优点:
• 缺点:
每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象
观察者模式又被称为发布-订阅模式,属于行为型设计模式的一种,是一个在项目中经常使用的模式。 它的定义如下。
**定义:**定义对象间一种一对多的依赖关系,每当一个对象改变状态时,则所有依赖于它的对象都会 得到通知并被自动更新。
• 使用场景:
• 优点:
• 缺点:
在应用观察者模式时需要考虑一下开发效率和运行效率的问题。程序中包括一个被观察者、多 个观察者,开发、调试等内容会比较复杂,而且在 Java 中消息的通知一般是顺序执行的,那么一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般会采用异步方式。
class Solution { public String addStrings(String num1, String num2) { StringBuilder res = new StringBuilder(""); int i = nums1.length() -1, j = nums2.length() - 1; int carry = 0; while(i >= 0 || j >= 0) { int n1 = i >= 0 ? num1.charAt(i) - '0' : 0; int n2 = j >= 0 ? num2.charAt(j) - '0' : 0; int temp = n1 + n2 + carry; carry = temp / 10; res.append(temp % 10); i--; j--; } if(carry == 1) res.append(1); return res.reverse().toString(); } }
int n2 = j >= 0 ? num2.charAt(j) - '0' : 0;
int temp = n1 + n2 + carry;
carry = temp / 10;
res.append(temp % 10);
i--;
j--;
}
if(carry == 1) res.append(1);
return res.reverse().toString();
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。