23 种经典设计模式——0.0.1

设计模式是前人编程经验的总结,是为了解决程序的可读性,可扩展性,降低维护成本,解决复杂的业务问题。

1.分类 设计模式

创建型工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、
建造者模式(Builder)、原型模式(Prototype)、单例模式(Singleton)
结构型适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、
装饰器模式(Decorator)、门面模式(Facade)、享元模式(Flyweight)、
代理模式(Proxy)
行为型解释器模式(Interpreter)、模板方法模式(Template Method)、
责任链模式(Chain of Responsibility)、命令模式(Command)、
迭代器模式(Iterator)、调解者模式(Mediator)、备忘录模式(Memento)、
观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、
访问者模式(Visitor)


           通常来说,设计模式都是混合使用,不会独立应用。

           在平时的应用中,不是用设计模式去生搬硬套,而是根据具体业务问题需要时去选择。

2.设在应用中遵循六大原则:

a、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现
一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的
效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。


b、里氏代换原则(Liskov Substitution Principle)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原
则中说,任何基类可以出现的地方,子类一定可以出现。 LSP 是继承复用的基石,只有当衍生类可以
替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增
加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而
基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。


c、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。


d、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,
从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。
所以上文中多次出现:降低依赖,降低耦合。


e、迪米特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能
模块相对独立。


f、合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承。

g、单一职责原则

一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。对功能进行分类,代码进行解耦

 

3.1、简单工厂模式(Factory)

应用场景:又叫做静态工厂方法(StaticFactory Method)模式,但不属于 23 种设计模式之一。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。
Spring 中的 BeanFactory 就是简单工厂模式的体现,根据传入一个唯一的标识来获得 Bean 对象,但
是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。

归类特点穷举
创建型模式是复杂工厂模式的思维模型批量生产、标准化

3.2、工厂方法模式(Factory Method)
应用场景:通常由应用程序直接使用 new 创建新的对象,为了将对象的创建和使用相分离,采用工厂模
式,即应用程序将对象的创建及初始化职责交给工厂对象。
一般情况下,应用程序有自己的工厂对象来创建 Bean.如果将应用程序自己的工厂对象交给 Spring 管
理,那么 Spring 管理的就不是普通的 Bean,而是工厂 Bean。


 

个人总结:工厂模式使用场景是应用程序直接用new 创建对象,但是我们为了将对象的创建和使用分离。使用工厂模式即应用程序将对象的创建和初始化的职责交给工厂。工厂模式我们常用简单工厂模式和工厂方法模式。简单工厂模式也叫做静态工厂模式,实质就是工厂类根据传入的参数动态创建所需的产品类。工厂方法模式我们一般使用抽象父工厂具体的工厂对象来实现,通过调用对应工厂实例的方法来得到对应的产品。(使用抽象类的而不是用接口的原因是因为抽象类中我们可以定义一下公共业务逻辑的实现方便管理)

3.3、单例模式(Singleton)
应用场景:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Spring 中的单例模式完成了后半句话,即提供了全局的访问点 BeanFactory。但没有从构造器级别去
控制单例,这是因为 Spring 管理的是是任意的 Java 对象。 Spring 下默认的 Bean 均为单例。



常用单例模式写法:饿汉式、懒汉式、注册式、序列化。

个人总结:单例模式使用场景是要保证一个类仅有一个实例,并提供一个全局访问点,避免实例的重复创建;单例模式一则,解决多线程并发访问的问题,二则是为了节约系统内存,提高系统性能和运行效率。单例模式实现的方法有很多,有饿汉式、懒汉式、注册式、序列化的方式以及内部类的方式。

饿汉式:饿汉式单例就是在类加载的时候就立即初始化,并且创建单例对象 。优点:没有加任何的锁、执行效率比较高, 在用户体验上来说,比懒汉式更好。绝对线程安全,在线程之前就是实例化了。缺点:浪费了内存。

懒汉式:在外部需要使用的时候才进行实例化,懒汉式就是调用方法之前,先判断 如果没有初始化,将其进行初始化,并且赋值 然后可以将该实例缓存好,如果已经初始化 直接返回之前已经保存好的结果。另一方面我们为了保证线程安全要使用synchronized,但是使用它有个缺点就是浪费性能,会比饿汉式性能差很多。当然另一种更好的方式就是使用内部类(注意反射入侵问题 修改构造器 使其创建第二个实例时抛出异常【见实例】)来实现。内部类在只有使用的时候才会被加载,我们可以利用这一延迟加载的特性来实现懒汉式单例。即避免了使用synchronize造成的性能问题,也解决了内存浪费的问题。

注册式:使用map容器存储实例,将类名作为key,调用时先根据key从map中获取,如果不存在则创建(Spring中时通过类名反射的方式创建【降低耦合】)实例存储在容器中,存在则返回实例

序列化:将内存中的状态通过转换成字节码的方式从而转换成io流写入到其他地方(可以是磁盘、网络IO) 或在内存中状态给永久保存下来了。通过反序列化将已经持久化的字节码转换成io流,通过io流的读取,将io流转换成Java实例。我们可以通过重写 readResolve()方法来防止单例被破坏【见实例】。

实例

1.4、原型模式(Prototype)
应用场景:原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
所谓原型模式,就是 Java 中的克隆技术,以某个对象为原型。复制出新的对象。显然新的对象具备原
型对象的特点,效率高(避免了重新执行构造过程步骤)

个人总结:原型模式就是Java中的克隆技术,例如当我们从数据库查询获取到DTO我们需要将其赋值给VO,然后VO在传输到view。在这种场景下就适合用到原型模式。实现原型模式的方式有很多种,我们可以用反射或者序列化的方式实现。克隆也分为浅度克隆和深度克隆。要实现一个对象的克隆,需要实现Cloneable的接口【这个接口没有什么方法仅仅是起一个标志作用】重写clone()方法【clone()这个方法是从Object继承下来的】。要实现深度克隆要对其引用类型或数组的成员变量也进行一次clone,或者也可以通过序列化的方式实现【见案例】

深度克隆和浅度克隆的概念: Object中的克隆方法是浅度克隆,JDK规定了克隆需要满足的一些条件,简要总结一下就是:对某个对象进行克隆,对象的的成员变量如果包括引用类型或者数组,那么克隆的时候其实是不会把这些对象也带着复制到克隆出来的对象里面的,只是复制一个引用,这个引用指向被克隆对象的成员对象,但是基本数据类型是会跟着被带到克隆对象里面去的。而深度可能就是把对象的所有属性都统统复制一份新的到目标对象里面去

 

1.5、代理模式(Proxy)

应用场景:为其他对象提供一种代理以控制对这个对象的访问。从结构上来看和 Decorator 模式类似,但 Proxy 是控制,更像是一种对功能的限制,而 Decorator 是增加职责。Spring 的 Proxy 模式在 AOP 中有体现,比如 JdkDynamicAopProxy 和 Cglib2AopProxy。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值