本来在讲完设计模式的10个要素之后,应该讲一讲设计模式的六大原则。
但是在发现自己对于六大原则的理解不够(基本是抄书中原话),觉得这样没有自己的理解,所以选择学完所有的设计模式之后再来谈谈设计模式的六大原则。
设计模式23种
按照特点分为三类:创建型、结构型和行为型。
其中创建型有5种分别是:单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式;
结构型有7种分别是:代理模式、装饰模式、适配器模式、组合模式、桥梁模式、外观模式和享元模式;
行为型有11种分别是:模版方法模式、命令模式、责任链模式、策略模式、迭代器模式、中介者模式、观察者模式、备忘录模式、访问者模式、状态模式和解释器模式。
这次要说的是创建型5种设计模式。
创建型的设计模式,是对类的实例化过程的抽象化,能够提供对象的创建和管理职责,简单理解就是这些设计模式都是围绕着一个主题创建对象。
下面对这些设计模式从三个维度进行描述分别是:定义、应用和实例。
1.单例模式
定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
简单理解就是,单例设计模式就是为了保证一个类只有一个实例对象的一种设计模式。
特点是构造方法是私有的,也因此不能创建子类。
在Java语言下,实现单例模式有两种方式分别叫:饿汉模式和懒汉模式。
饿汉模式,顾名思义看见吃的很饿,所以一加载类就创建类实例;
1 // 饿汉式单例 2 public class Singleton { 3 4 // 指向自己实例的私有静态引用,主动创建 5 private static Singleton singleton = new Singleton(); 6 7 // 私有的构造方法 8 private Singleton(){} 9 10 // 以自己实例为返回值的静态的公有方法,静态工厂方法 11 public static Singleton getSingleton(){ 12 return singleton; 13 } 14 }
懒汉模式,就是直到第一次用到才进行实例化。
1 // 懒汉式单例 2 public class Singleton { 3 4 // 指向自己实例的私有静态引用 5 private static Singleton singleton; 6 7 // 私有的构造方法 8 private Singleton(){} 9 10 // 以自己实例为返回值的静态的公有方法,静态工厂方法 11 synchronized public static Singleton getSingleton(){ 12 // 被动创建,在真正需要使用时才去创建 13 if (singleton == null) { 14 singleton = new Singleton(); 15 } 16 return singleton; 17 } 18 }
当然还有其他实现方式,大家可以自行百度
2.工厂方法模式
定义:一个用于创建对象的接口,让子类决定实例化哪个类。
简单理解就是让ConcreteCreator类决定实例化哪个ConcreteProduct对象实例。
当增加一个新的ConcreteProduct类时,很方便扩展,仅仅需要创建一个新的ConcreteProduct类以及在调用的地方传入新的类即可。
3.抽象工厂模式
定义:创建一组相关或相互依赖的对象提供一个接口,而且无须制定他们的具体类
简单理解就是通过ConcreteFactory类来创建具体的ProductA1、ProductA2、ProductB1、ProductB2对象实例
当新增一个ProductA3或ProductB3很方便,需要新建一个ConcreteFactory或修改ConcreteFactory类和创建产品ProductA3或ProductB3即可。
但是新增一个ProductC将会变得很困难,之前的ConcreteFactory类都需要进行修改。
还有一个值得注意的是,当抽象工厂只有一个产品族时,将会退化成工厂方法模式。
ps:产品族指的,以ProductA为例,是所有实现ProductA接口的类
4.建造者模式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
简单理解就是通过Director类来控制创建的流程步骤,ConcreteBuilder类来实现每个流程步骤,最后生成一个Product实例对象
建造者模式和抽象工厂模式虽然都是创建对象,但是两种设计模式的侧重点不同,前者关注重点在对象的创建具体步骤上,后者关注重点在对象的创建不关心创建的细节。
5.原型模式
定义:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
简单理解就是Prototype类实现Cloneable接口提供一个Object类的clone接口,在ConcretePrototype类中实现clone方法,最后通过CLient类来触发原型对象的复制。
原型设计模式创建原型的好处是直接在内存中进行二进制流复制,这种复制的方式比直接new一个对象性能好,并且这种方式会规避构造函数,因此在用的时候需要小心。
这是我第二次写博客,从这次写我体会到即使是那些贴原文的博客,其实写起来也并不容易。
这次写5种设计模式,写的过程发现有些低估写的难度,因为这5种设计模式随便拿出一种都可以写很多内容,在自己准备不足的情况下,5种设计模式只能是说说定义分别是什么,然后是自己按照类图写出对于定义的理解,之后就是一些注意事项。
改进:下次学一个写一个设计模式,尽可能写出对于设计模式自己的理解。
学习《设计模式(Java版)》——创建型设计模式20200919
原文:https://www.cnblogs.com/xiaojun-9/p/13697637.html