设计模式分类
-
创建型模式
- 单例模式
- 工厂方法模式
- 抽象工厂模式
- 建造者模式
- 原型模式
-
结构型模式
- 适配器模式
- 桥接模式
- 装饰者模式
- 组合模式
- 外观模式
- 享元模式
- 代理模式
-
行为型模式
- 模板方法模式
- 命令模式
- 迭代器模式
- 观察者模式
- 中介者模式
- 状态模式
- 策略模式
- 责任链模式
- 访问者模式
- 备忘录模式
- 解释器模式
设计模式详解
单例模式
一个类只有一个实例,并且提供全局访问器。
如果一个类只有存在一个的必要,在全局多处需要使用到。比如管理器、控制器。
单例模式分为两类,懒汉式、饿汉式。
懒汉式:在使用时创建对象,存在线程安全问题,需要加锁
饿汉式:在初始化时创建单例,不存在线程安全问题
懒汉式示例
//普通懒汉式
using UnityEngine;
public class Singleton1
{
private static Singleton1 _Instance;
public static Singleton1 Instance
{
get
{
if (_Instance == null)
{
_Instance = new Singleton1();
}
return _Instance;
}
}
public void Print()
{
Debug.Log("Singleton1");
}
}
//普通懒汉式 线程安全
using UnityEngine;
public class Singleton2
{
private static readonly object locker = new object();
private static Singleton2 _Instance;
public static Singleton2 Instance
{
get
{
if (_Instance == null)
{
lock(locker)
{
if (_Instance == null)
{
_Instance = new Singleton2();
}
}
}
return _Instance;
}
}
public void Print()
{
Debug.Log("Singleton2");
}
}
饿汉式示例
//饿汉式
using UnityEngine;
public class Singleton3
{
private static Singleton3 _Instance = new Singleton3();
public static Singleton3 Instance => _Instance;
public void Print()
{
Debug.Log("Singleton3");
}
}
实际常用单例模式示例
using UnityEngine;
public class Singleton4
{
public static readonly Singleton4 Instance;
static Singleton4()
{
Instance = new Singleton4();
}
private Singleton4()
{
}
public void Print()
{
Debug.Log("Singleton4");
}
}
多态单例模式
using UnityEngine;
public abstract class Singleton5
{
public void Print()
{
Debug.Log("Singleton5");
}
}
public class Signleton5_1 : Singleton5
{
public Signleton5_1()
{
}
}
public class Singleton5<T> where T : Singleton5,new()
{
private static readonly object locker = new object();
private static T _Instance;
public static T Instnace
{
get
{
if (_Instance == null)
{
lock (locker)
{
if (_Instance == null)
{
_Instance = new T();
}
}
}
return _Instance;
}
}
}
建造者模式
创建一个组合型复杂对象,同样的创建过程创建不同的表示,建造者模式将组装过程进行封装。
模式中的角色
建造者、产品、指挥者。
建造者:根据产品型号创建产品对象
产品:被创建的复杂对象
指挥者:指挥建造者创建复杂对象,告诉建造者产品型号。
原型模式
复制一个现有对象来创建一个新的对象
复制类型可分为深拷贝与浅拷贝。
深拷贝:只有值类型进行复制,引用类型只有引用拷贝,引用的具体值未拷贝。使用 Object 类中的 MemberwiseClone。
浅拷贝:值类型与引用类型的值都被拷贝。 实现方法:序列化与反序列化。
观察者模式
观察对象订阅主题对象的状态变化。
主题对象具有添加、删除、通知观察者的功能。
观察者对象具有主题对象状态变化的接口。
这个模式在程序中非常常用,比如C#中的事件。
状态模式
一个对象在其内部状态改变时,改变它的行为。
状态模式中有两个角色,状态持有者与状态行为类。(状态行为类分为抽象状态行为,与具体状态行为)
实际应用
GF框架中的有限状态机
责任链模式
将请求沿着处理链进行传递,直到一个处理者处理完该请求为止。
责任链有处理者(分为抽象与具体),责任链持有者两个角色。
处理者:处理请求的接口或者具体处理请求。
持有者:持有处理者列表,执行请求时对首个处理者进行请求传递。