JAVA GoF设计模式 1-创建型设计模式
前言
目的:解决了创建对象时候的问题
5种:单例模式、抽象工厂模式、工厂模式、建造者模式、原型模式
01 工厂方法
追 MM 少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是 MM 爱吃的东西,虽然口味有所不同,但不管你带 MM 去麦当劳或肯德基,只管向服务员说「来四个鸡翅」就行了。麦当劳和肯德基就是生产鸡翅的 Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。02 建造者模式
MM 最爱听的就是「我爱你」这句话了,见到不同地方的 MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到 MM 我只要按对应的键,它就能够用相应的语言说出「我爱你」这句话了,国外的 MM 也可以轻松搞掂,这就是我的「我爱你」builder。建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。03 抽象工厂
请 MM 去麦当劳吃汉堡,不同的 MM 有不同的口味,要每个都记住是一件烦人的事情,我一般采用 Factory Method 模式,带着 MM 到服务员那儿,说「要一个汉堡」,具体要什么样的汉堡呢,让 MM 直接跟服务员说就行了。工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。04 原型模式
跟 MM 用 QQ 聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要 copy 出来放到 QQ 里面就行了,这就是我的情话 prototype 了。(100 块钱一份,你要不要)原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。05 单态模式
俺有 6 个漂亮的老婆,她们的老公都是我,我就是我们家里的老公 Sigleton,她们只要说道「老公」,都是指的同一个人,那就是我 (刚才做了个梦啦,哪有这么好的事)单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的 “单一实例” 的需求时才可使用。一、单例模式 // 单例模式-饿汉式-方式一 静态常量 public class Singleton { // 1、构造器私有化,防止外部用构造器 private Singleton(){} // 2、类的内部创建最终对象 private static final Singleton singleton = new Singleton(); // 3、对外提供方法获取实例对象 public static Singleton getInstance(){ return singleton; } } 优点:简单、避免多线程的同步问题 (Runtime runtime = Runtime.getRuntime();) 劣势:没有达到懒加载的优势 // 单例模式-饿汉式-方式二 静态代码块 public class Singleton { // 1、构造器私有化,防止外部用构造器 private Singleton(){} // 2、类的内部创建最终对象 private static final Singleton singleton; static{ singleton = new Singleton(); } // 3、对外提供方法获取实例对象 public static Singleton getInstance(){ return singleton; } } 优点:简单、避免多线程的同步问题 劣势:没有达到懒加载的优势 // 单例模式-懒汉式式 - 线程不安全-不推荐 public class Singleton { // 1、构造器私有化,防止外部用构造器 private Singleton(){} // 2、类的内部创建对象 private static Singleton singleton; // 3、对外提供方法获取实例对象 public static Singleton getInstance(){ return singleton == null ? new Singleton():singleton; } } 优点:懒加载效果,不会造成内存浪费 劣势:线程不安全 // 单例模式-懒汉式式 - 同步方法-不推荐 public class Singleton { // 1、构造器私有化,防止外部用构造器 private Singleton(){} // 2、类的内部创建对象 private static Singleton singleton; // 3、对外提供方法获取实例对象 public static synchronized Singleton getInstance(){ return singleton == null ? new Singleton():singleton; } } 优点:懒加载效果,不会造成内存浪费 劣势:效率低 // 单例模式-懒汉式式 - 双重 public class Singleton { // 1、构造器私有化,防止外部用构造器 private Singleton(){} // 2、类的内部创建对象 private static Singleton singleton; // 3、对外提供方法获取实例对象 public static Singleton getInstance(){ if(singleton == null){ synchronized(Singleton.class){ if(singleton == null){ singleton = new Singleton(); } } } return singleton; } } 优点:懒加载效果,内存使用,效率高 劣势:JVM指令重排(理想状态:分配内存>>初始化变量>>变量赋值),导致NPE异常 volatile:轻量级的同步机制;保证可见性(共享变量)、没有保证原子性(一致性)、禁止指令重排 // 单例模式-懒汉式式 - 静态内部类 public class Singleton { // 1、构造器私有化,防止外部用构造器 private Singleton(){} // 2、内部静态类创建对象 private static class SingletonInstance { public static final Singleton INSTANCE = new Singleton(); }; // 3、对外提供方法获取实例对象 public static Singleton getInstance(){ return SingletonInstance.INSTANCE; } 单例模式的使用场景: 对于一些需要频繁创建销毁的对象、重量级的对象、经常使用的对象、工具类对象、数据源、session等
二、工厂模式
简单工厂模式 案例:完成水果汁订购功能 订购 >> 水果汁种类 >> 预处理准备制作 >> 打包 >> 发货 >> 签收 // 抽象类 public abstract class Fruit { // 制作 public abstract void make(); // 打包 public abstract void package(); // 发货 public abstract void send(); // 签收 public abstract void mark(); } // 苹果汁 public class Apple extends Fruit { // 具体实现父类方法 } // 橙汁 public class Orange extends Fruit { // 具体实现父类方法 } // 简单工厂模式-定义创建对象的类 public class SimpleFactory { public Fruit createFruit(String type){ // 果汁的业务逻辑 return T; } }
本文来自博客园,作者:chch213,转载请注明原文链接:https://www.cnblogs.com/chch213/p/16421069.html