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;
}
 
}

 

 

 

posted @ 2022-06-28 20:55  chch213  阅读(29)  评论(0编辑  收藏  举报