设计模式

设计模式

六大原则

  1. 单一职责:字面意思

  2. 里氏替换原则:基类能出现的地方子类一定可以出现;子类尽量不要重写或重载父类的实现方法(有时可以使用final来强制遵循).

  3. 依赖倒置原则:高层模块不应该依赖低层模块,两者都依赖其抽象;核心思想是面向接口编程(结合里氏替换原则使用。里氏替换原则指出父类出现的地方子类就可以出现,结合依赖倒置原则可以得出一个通俗的规则:接口负责定义抽象方法,并且声明与其他对象的依赖关系,抽象类负责公共构造部分的实现,实现类准确地实现业务逻辑,同时在适当的时候对父类进行细化)。

  4. 接口隔离原则:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。

  5. 迪米特法则(最少知道原则):就是一个类对自己依赖的类知道的越少越好。

  6. 开闭原则:就是说对扩展开放,对修改关闭。

三大分类

创建型、结构型、行为型

单例模式

1.饿汉式单例 将构造函数私有化,唯一实例已被创建,提供一个静态方法向外提供实例对象 2.懒汉式单例 基本同上,区别在于实例先未被初始化,提供的方法判断实例引用为空时才初始化;并且以synchronized修饰方法以保证多线程环境下只会有一个实例

优点:减少内存开支、避免单一资源的多重占用 缺点:单例无法创建子类,扩展困难,同时对测试不利 使用场景:要求生成唯一序列号的环境、共享访问点(web页面上的计数器)、创建对象需要资源过多(访问IO和数据库等资源)、需要定义大量静态常量和方法的环境 应用:spring框架中每个bean默认单例、java.lang.Runtime类 注意事项:有状态单例类如提供唯一序列号、无状态单例类如IO访问,在分布式系统中有状态单例会出现问题应避免;序列化和克隆破坏实例唯一性

工厂方法模式

用意是定义一个产品对象的的工厂接口,将实际创建性工作推迟到子类当中 工厂方法模式 涉及四个角色:

  1. 抽象工厂角色:任何在创建对象的工厂类必须实现这个接口

  2. 具体工厂角色:实现了抽象工厂接口,含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。

  3. 抽象产品角色:负责定义产品的共性,实现对产品最抽象的定义

  4. 具体产品角色:实现抽象产品接口,工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。 优点

  5. 良好的封装性,如果一个调用者需要一个具体的产品对象,只要知道这个产品的类名或约束字符串即可,不用知道创建对象的过程如何,降低了模块间的耦合。

  6. 优秀的可扩展性

  7. 屏蔽产品类的细节 使用场景 灵活的、可扩展的框架、 通过WebService与一个非Java的项目交互,虽然WebService号称是可以做到异构系统的同构化,但是在实际开发中,还是会碰到很多问题,如类型问题、WSDL文件的支持问题等。从WSDL中产生的对象都认为是一个产品,然后由一个具体的工厂类进行管理,减少与外围的耦合。 使用在测试开发的框架下:例如,测试一个类 A,就需要将与类A关联的类B也同时产生出来,使用工厂方法模式可以将类B虚拟出来,避免类A与类B的耦合。

抽象工厂模式 工厂方法,一个工厂的抽象只造一个东西,不同的实现造出来的东西“类型”相同,“属性”不同。 抽象工厂,一个工厂造一系列东西,不同实现造出来的这一系列东西“类型”相同,“属性”不同。当这一系列东西实际上只有一个时,抽象工厂退化成工厂模式

建造者模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 4个角色: 抽象建造者角色:角色用于规范产品的各个组成部分,并进行抽象,一般独立于应用程序的逻辑。 具体建造者角色:实现抽象建造者中定义的所有方法,并且返回一个组建好的产品实例。 产品角色:角色是建造中的复杂对象,一个系统中会有多于一个的产品类,这些产品类并不一定有共同的接口,完全可以是不相关联的。 导演者角色:角色负责安排已有模块的顺序,然后告诉 Builder 开始建造。 使用场景 相同的方法,不同的执行顺序,产生不同的结果时,可以采用建造者模式。建造者模式关注的是零件类型和装配工艺顺序,这是与工厂方法模式最大的不同之处,虽然同为创建类模式,但是重点不同。

原型模式

用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象

3个角色 客户角色:该角色提出创建对象的请求 抽象原型角色:通常由一个Java接口或抽象类实现,给出所有的具体原型类所需的接口 具体原型角色:该角色是被复制的对象,必须实现抽象原型接口

在Java中实现原型模式非常简单,需要让抽象原型Prototype接口继承 Cloneable 接口,以标明该接口的实现类可以被复制,并声明一个 clone()方法

优点

性能优良:原型模式是在内存二进制流的复制,要比直接new一个对象性能好

tips Java中Object提供的clone()方法采用的是“浅”克隆,即只复制关联对象的引用,而不复制关联对象的数据。如果需要“深”克隆,则需要在覆盖clone()方法时手动控制克隆的深度。

结构型

结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构。结构型模式的目的是通过组合类或对象产生更大结构以适应更高层次的逻辑需求

代理模式

为其他对象提供一种代理以控制对这个对象的访问。 代理模式是一项基本的设计技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上也采用了代理模式。

3个角色

抽象主题(Subject)角色:该角色是真实主题和代理主题的共同接口,以便在任何可以使用真实主题的地方都可以使用代理主题。

代理主题(Proxy Subject)角色:也叫做委托类、代理类,该角色负责控制对真实主题的引用,负责在需要的时候创建或删除真实主题对象,并且在真实主题角色处理完毕前后做预处理和善后处理工作。

真实主题(Real Subject)角色:该角色也叫做被委托角色、被代理角色,是业务逻辑的具体执行者。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值