Java设计模式随笔-生活工作点滴

23种设计模式知识要点(一)

2019-07-08  本文已影响120人  编辑小猿

一、单例模式(Singleton Pattern )

定义:Ensure a class has only one instance, and provide a global point of access

to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实

例。)

通用代码:(是线程安全的)

public class Singleton {private static final Singleton singleton = new Singleton();//限制产生多个对象privateSingleton(){}复制代码

//通过该方法获得实例对象

public static SingletongetSingleton(){returnsingleton;}复制代码

//类中其他方法,尽量是 static

public static voiddoSomething(){}}复制代码

使用场景:

● 要求生成唯一序列号的环境;

● 在整个项目中需要一个共享访问点或共享数据,例如一个 Web 页面上的计数

器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确

保是线程安全的;

● 创建一个对象需要消耗的资源过多,如要访问 IO 和数据库等资源;

● 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式

(当然,也可以直接声明为 static 的方式)。

线程不安全实例:

public class Singleton {private static Singleton singleton = null;//限制产生多个对象privateSingleton(){}复制代码

//通过该方法获得实例对象

public static SingletongetSingleton(){if(singleton == null){singleton = new Singleton(); }returnsingleton;}}复制代码

解决办法:

在 getSingleton 方法前加 synchronized 关键字,也可以在 getSingleton 方法内增

加 synchronized 来实现。 最优的办法是如通用代码那样写。

二、工厂模式

定义:Define an interface for creating an object,but let subclasses decide which

class to instantiate.Factory Method lets a class defer instantiation to subclasses.

(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类

的实例化延迟到其子类。)

Product 为抽象产品类负责定义产品的共性,实现对事物最抽象的定义;

Creator 为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工

厂 ConcreteCreator 完成的。

具体工厂类代码:

public class ConcreteCreator extends Creator {public T createProduct(Class c){Product product=null;try {product =(Product)Class.forName(c.getName()).newInstance();} catch (Exception e) {//异常处理}return(T)product;}}复制代码

简单工厂模式:

一个模块仅需要一个工厂类,没有必要把它产生出来,使用静态的方法

多个工厂类:

每个人种(具体的产品类)都对应了一个创建者,每个创建者独立负责创建对应的

产品对象,非常符合单一职责原则

代替单例模式:

单例模式的核心要求就是在内存中只有一个对象,通过工厂方法模式也可以只在内

存中生产一个对象

延迟初始化:

ProductFactory 负责产品类对象的创建工作,并且通过 prMap 变量产生一个缓

存,对需要再次被重用的对象保留

使用场景:jdbc 连接数据库,硬件访问,降低对象的产生和销毁

三、抽象工厂模式(Abstract FactoryPattern )

定义:Provide an interface for creating families of related or dependent objects

without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供

一个接口,而且无须指定它们的具体类。)

抽象工厂模式通用类图:

抽象工厂模式通用源码类图:

抽象工厂类代码:

public abstract class AbstractCreator {复制代码

//创建 A 产品家族

public abstract AbstractProductA createProductA();复制代码

//创建 B 产品家族

public abstract AbstractProductB createProductB();}复制代码

使用场景:

一个对象族(或是一组没有任何关系的对象)都有相同的约束。

涉及不同操作系统的时候,都可以考虑使用抽象工厂模式

kx33389,加她就能免费领取分布式、微服务、源码分析、性能优化、高并发高可用等技术的资料

四、模板方法模式(Template MethodPattern )

定义:Define the skeleton of an algorithm in an operation,deferring some steps to

subclasses.Template Method lets subclasses redefine certain steps of an

algorithm without changing the algorithm's structure.(定义一个操作中的算法的框

架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义

该算法的某些特定步骤。)

AbstractClass 叫做 抽象模板,它的方法分为两类:

● 基本方法

基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。

● 模板方法

可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调

度,完成固定的逻辑。

注意: 为了防止恶意的操作,一般模板方法都加上 final 关键字,不允许被覆

写。

具体模板:ConcreteClass1 和 ConcreteClass2 属于具体模板,实现父类所定义的

一个或多个抽象方法,也就是父类定义的基本方法在子类中得以实现

使用场景:

● 多个子类有公有的方法,并且逻辑基本相同时。

● 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由

各个子类实现。

● 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然

后通过钩子函数(见“模板方法模式的扩展”)约束其行为。

五、建造者模式(Builder Pattern )

定义:Separate the construction of a complex object from its representation so

that the same construction process can create different representations.(将一个

复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)

● Product 产品类

通常是实现了模板方法模式,也就是有模板方法和基本方法,例子中的

BenzModel 和 BMWModel 就属于产品类。

● Builder 抽象建造者

规范产品的组建,一般是由子类实现。例子中的 CarBuilder 就属于抽象建造者。

● ConcreteBuilder 具体建造者

实现抽象类定义的所有方法,并且返回一个组建好的对象。例子中的 BenzBuilder

和 BMWBuilder 就属于具体建造者。

● Director 导演类

负责安排已有模块的顺序,然后告诉 Builder 开始建造

使用场景:

● 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。

● 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,

则可以使用该模式。

● 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使

用建造者模式非常合适。

建造者模式与工厂模式的不同:

建造者模式最主要的功能是基本方法的调用顺序安排,这些基本方法已经实现了,

顺序不同产生的对象也不同;

工厂方法则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的。

上一篇下一篇

猜你喜欢

热点阅读