Java设计模式

3.1常用设计者模式分类

1.创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程

属于创建型模式常用的有单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式

2.构造型模式:把类或对象结合在一起形成一个更大的结构

属于构造型模式常用的有适配器模式,桥接模式,组合模式,装饰模式,外观模式,亨元模式

3.行为型模式:类和对象如何交互,及划分责任和算法

属于行为型模式常用的有访问者模式,模板模式,策略模式,状态模式,观察者模式,备忘录模式,中介者模式

1.1单例模式

1.保证一个类仅有一个实例,并提供一个访问它的全局访问点

  1. 单例模式主要有3个特点,: 2.1 单例类确保自己只有一个实例。   2.2 单例类必须自己创建自己的实例。   2.3 单例类必须为其他对象提供唯一的实例。

  2. 实现方式:懒汉单例类和饿汉单例类   3.1 懒汉式单例类     对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回。 懒汉模式只在外部对象第一次请求实例的时候才去创建。   3.2 饿汉式单例     对于饿汉模式,我们可以这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。

      3.3 懒汉模式和饿汉模式的优缺点:     懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。

    ​ 饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。

    ​ 枚举类也可以实现单例

    1.2工厂模式

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

    工厂模式代码实现步骤

    1. 创建抽象工厂类,定义具体工厂的公共接口

    2. 创建抽象产品类 ,定义具体产品的公共接口

    3. 创建具体产品类(继承抽象产品类), 定义生产的具体产品

    4. 创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法

    5. 外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例

    1.3代理模式

    为其它对象提供一种代理以控制对这个对象的访问。

      解决的问题:如果直接访问对象比较困难,或直接访问会给使用者或系统带来一系列问题。这样对于客户端(调用者)来说,就不需要直接与真实对象进行交互,解除了调用者与真实对象的耦合。

    代理模式的代码实现

    ​ 1.抽象实体,定义真实实体与代理的公共接口

    ​ 2.真实实体,真正的功能实现者

    ​ 3.代理,用来控制和访问真实实体

    ​ 4.客户端的调用

    优点

        4.1.1 对客户端来说,隐藏了真实对象的细节及复杂性。

        4.1.2 实现了客户端(调用者)与真实对象的松耦合。

        4.1.3 远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的性能与处理速度,可以快速响应并处理客户端请求。

        4.1.4 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。

        4.1.5 安全代理可以控制对真实对象的使用权限。

    缺点

        4.2.1 实现代理需要而为增加一个访问控制层,增加了额外工作。有的代理实现起来非常复杂。

代理模式也分静态代理和动态代理

1、静态代理只能通过手动完成代理操作,如果被代理类增加新的方法,代理类需要同步 新增,违背开闭原则。

2、动态代理采用在运行时动态生成代码的方式,取消了对被代理类的扩展限制,遵循开 闭原则。

3、若动态代理要对目标类的增强逻辑扩展,结合策略模式,只需要新增策略类便可完成, 无需修改代理类的代码。 动态代理分为jdk提供的和spring的cglib

1.JDK

代理类所在包:java.lang.reflect.Proxy JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是: static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h ) 2.CGLib

Cglib代理模式的基本介绍

静态代理和JDK代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理-这就是Cglib代理 Cglib代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展, 有些书也将Cglib代理归属到动态代理。 Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口.它广泛的被许多AOP的框架使用,例如Spring AOP,实现方法拦截 在AOP编程中如何选择代理模式: 目标对象需要实现接口,用JDK代理 目标对象不需要实现接口,用Cglib代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值