创建型模式-EP2

ooowl
  • 系统设计
  • 软件工程
  • 设计模式
About 4 min

创建型模式-EP2

工厂方法模式

简单工厂和工厂一块放这里。 简单工厂在创建对象的时候通过工厂统一的创建对象,创建的时候指明要创建什么对象,这样可以在不用更改调用方,只更改创建方和创建行为就可以了。

Click to see more
namespace DesignPatterns;  
  
  
  
public enum MouseType  
{  
    None,// 回忆一下enum  
    HpMouse,  
    LazerMouse  
  
}  
  
public class BaseMouse // 基础的鼠标类  
{  
    public string Name;  
  
    public BaseMouse(string name)  
    {        this.Name = name;  
    }  
    public void MousePrint()  
    {        Console.WriteLine($"{Name} Printed!");  
    }}  
  
public class HpMouse:BaseMouse  
{  
    public HpMouse(string name) : base(name)  
    {        Console.WriteLine($"Create a HpMouse {Name}");  
    }  
}  
  
public class LazerMouse:BaseMouse  
{  
    public LazerMouse(string name) : base(name)  
    {        Console.WriteLine($"Create a LazerMouse {Name}");  
    }  
}  
  
  
public class MouseSimpleFactory  
{  
    private BaseMouse m = null;  
    public BaseMouse GetMouse(string name,MouseType MT)  
    {        switch (MT) // 每当多一个的时候就要多加一个,这是简单工厂  
        {  
            case (MouseType.None):  
                m = new BaseMouse(name); // 赋值的时候发生了向上转型  
                break;  
            case (MouseType.HpMouse):  
                m = new HpMouse(name);  
                break;  
            case (MouseType.LazerMouse):  
                m = new LazerMouse(name);  
                break;  
            default:  
                throw new Exception("输入的类型不合法");  
                break;  
        }  
  
        return m;  
    }}

//-------Main中-----

class Program  
{  
    static void Main(string[] args)  
    {        
        Console.WriteLine("-----------------简单工厂模式-----------------");  
        MouseSimpleFactory mf = new MouseSimpleFactory();  
        BaseMouse bm=mf.GetMouse("新鼠标",MouseType.None); // 根据枚举(指定类型)返回指定的类型的子对象  
        bm.MousePrint();  
        BaseMouse hm=mf.GetMouse("新惠普鼠标",MouseType.HpMouse);  
        hm.MousePrint();
    }}



运行结果

-----------------简单工厂模式-----------------
新鼠标 Printed!
Create a HpMouse 新惠普鼠标
新惠普鼠标 Printed!

简单工厂模式违反了开闭原则,需要修改原有的创建工厂而不是新增,工厂模式把每一种子类都单独创建一个对应类型的工厂,新的代码使用的时候直接调用对应的工厂而不是指明统一的工厂(这不就是是接口抽象吗)

抽象工厂模式

生成器模式

原型模式

单例模式

单例设计模式open in new window
在unity中通常用在各种全局的 管理器 中,声音,唯一的角色管理器中,每次获得的都是这个东西,声音不会重复等。
保证一个类只有一个实例, 并提供一个访问该实例的全局节点,注意在多线程多进程环境下使用的时候会不会一个程序空间创建一个导致多次创建。

  • 将默认构造函数设为私有, 防止其他对象使用单例类的 new运算符。
  • 新建一个静态构建方法作为构造函数。 该函数会 “偷偷” 调用私有构造函数来创建对象, 并将其保存在一个静态成员变量中。 此后所有对于该函数的调用都将返回这一缓存对象。
  • 该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象,饿汉式在类加载的时候就创建无所谓,懒汉式可能在首次创建的时候创建多个。但是如果实例的创建过程非常耗时或耗资源,且长时间未使用,可能会造成资源的浪费
  • 建议不要在单例类中存储线程不安全的属性。这是因为单例对象是全局共享的,存储线程不安全的属性可能会引发并发问题 (虽然在.net中静态变量和构造函数的初始化也是懒汉式的触发,所以在调试器中并不能直接看到,而且调试器也不能直接看堆内容
Click to see more

namespace DesignPatterns;  
  
public class SingletonPrac  
{  
    private SingletonPrac()  
    {        Console.WriteLine("create a SingletonPrac instance");  
    }    // static SingletonPrac instance = null; // 实际上不在类里面,而在堆中  
    // 如果换成下面这行就是饿汉模式,类在堆初始化的时候就创建一次  
    static SingletonPrac instance = new SingletonPrac();  
    public static SingletonPrac GetInstance()  
    {        if (instance == null) //懒汉模式  
        {  
            instance = new SingletonPrac();  
        }        return instance;  
    }  
  
    public void Show()  
    {        Console.WriteLine($"SingletonPrac intance id: {this.GetHashCode()}"); // GetHashCode就是返回对象的哈希码,对象在内存中唯一的哈希码  
    }  
  
}

//-------Main中-----

class Program  
{  
    static void Main(string[] args)  
    {        
        Console.WriteLine("-----------------单例模式-----------------");  
        SingletonPrac s1 = SingletonPrac.GetInstance();  
        SingletonPrac s2 = SingletonPrac.GetInstance();  
        SingletonPrac s3 = SingletonPrac.GetInstance();  
        s1.Show();s2.Show();s3.Show();  
    }}

运行结果

-----------------单例模式-----------------
create a SingletonPrac instance
SingletonPrac intance id: 32854180
SingletonPrac intance id: 32854180
SingletonPrac intance id: 32854180

Loading...