常见设计模式

LiFasT
LiFasT
Published on 2024-05-27 / 68 Visits
0
0

单例模式

单件模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

饿汉式

优点:对象提前创建好了,使用的时候无需等待,效率高

缺点:对象提前创建,所以会占据一定的内存,内存占用大

以空间换时间

public class Singleton
{
    // 私有静态变量来保存单例的实例
    private static Singleton instance = new Singleton();

	private Singleton
	{
		//私有构造函数
	}
 
	public static Singleton getInstance()
	{
		return instance;
	}
}

懒汉式

从线程安全性上讲,不加同步的懒汉式是线程不安全的

优点:使用对象时,对象才创建,所以不会提前占用内存,内存占用小

缺点:首次使用对象时,需要等待对象的创建,而且每次都需要判断对象是否为空,运行效率较低

以时间换空间

public class Singleton
{
    // 私有静态变量来保存单例的实例
    private static Singleton instance = null;
 
    // 私有构造函数,确保外部无法直接实例化
    private Singleton() { }
 
    // 静态方法,提供全局访问点
    public static Singleton GetInstance()
    {
        // 如果实例为null,则新建一个实例
        if (instance == null)
        {
            instance = new Singleton();
        }
        return instance;
    }
}

以下是线程安全的懒汉式单例

public class Singleton
{
    private static Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton(), LazyThreadSafetyMode.ExecutionAndPublication);
 
    public static Singleton Instance { get { return lazy.Value; } }
 
    // 私有构造函数确保外部无法直接实例化
    private Singleton() { }
 
    // 其他方法和属性
}

观察者模式

自定义接口ISubject和IObserver实现

首先定义两个接口,ISubject接口是被观察者,IObserver接口是观察者。

public interface ISubject
    {
        void RegisterObserver(IObserver observer);// 注册订阅
        void RemoveObserver(IObserver observer);// 注销订阅
        void NotifyObserver();// 通知观察者
    }
public interface IObserver
    {
        void Update(string message);
    }

以下例子实现这两个接口

public class ConcreteSubject : ISubject
    {
        private List<IObserver> observers = new List<IObserver>();
        private string subjectState;
        public void NotifyObserver()
        {
            foreach (var observer in observers)
            {
                observer.Update(subjectState);
            }
        }
        public void RegisterObserver(IObserver observer)
        {
            observers.Add(observer);
        }
        public void RemoveObserver(IObserver observer)
        {
            observers.Remove(observer);
        }
        public void SetState(string state)
        {
            subjectState = state;
            NotifyObserver();
        }
    }
public class ConcreteObserver : IObserver
    {
        private string name;
        private string observerState;
        public ConcreteObserver(string name)
        {
            this.name = name;
        }
        public void Update(string message)
        {
            observerState = message;
            Console.WriteLine($"Observer {name} received message: {observerState}");
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            ConcreteSubject subject = new ConcreteSubject();

            IObserver observer1 = new ConcreteObserver("A");
            IObserver observer2 = new ConcreteObserver("B");

            subject.RegisterObserver(observer1);
            subject.RegisterObserver(observer2);

            subject.SetState("Good");

            Console.ReadKey();
        }
    }

发布订阅模式(事件代理)实现

这里等实际开发遇到了补充,暂时想不出例子

工厂模式

工厂模式通常用于封装对象的创建过程,使得代码更加灵活和可维护。当使用接口与工厂模式结合时,我们可以创建遵循特定接口的对象,而无需直接依赖于这些对象的实现。

自定义接口IProduct实现

定义产品接口

//抽象产品接口
    public interface IProduct
    {
         void Use();
    }

再写两个具体的产品:产品A和产品B

public class ConcreteProductA : IProduct
    {
        public void Use()
        {
            Console.WriteLine("具体产品A的操作");
        }
    }

    public class ConcreteProductB : IProduct
    {
        public void Use()
        {
            Console.WriteLine("具体产品B的操作");
        }
    }

定义一个工厂类,用于生成不同类型的产品

public class Factory
    {   
        //
        public IProduct CreateProduct(string productType)
        {
            //这里的productType可以用Enum
            switch (productType)
            {
                case "A":
                    return new ConcreteProductA();
                case "B":
                    return new ConcreteProductB();
                default:
                    throw new ArgumentException("无效的产品类型");
            }
        }
    }

以下是一个测试例子

class Program
    {
        static void Main(string[] args)
        {
            Factory factory = new Factory();

            IProduct productA = factory.CreateProduct("A");
            productA.Use();

            IProduct productB = factory.CreateProduct("B");
            productB.Use();

            Console.ReadKey();
        }
    }


Comment