一、使用new关键字
这个是我们使用最多的方式,创建简单,但是扩展性较差
二、使用工厂方法
工厂方法是一种设计模式,通过在类中定义静态方法来创建对象,把对象创建过程封装在方法内部
比如:
using System;
namespace SimpleFactorySample
{
class ChartFactory
{
//静态工厂方法
public static Chart GetChart(string type)
{
Chart chart = null;
if(type.Equals("histogram"))
{
chart=new HistogramChart();
Console.WriteLine("初始化设置柱状图");
}
else if(type.Equals("pie"))
{
chart=new PieChart();
Console.WriteLine("初始化设置饼状图");
}
else if(type.Equals("pie"))
{
chart=new LineChart();
Console.WriteLine("初始化设置折线图");
}
return chart;
}
}
}
创建的时候就是:
using System;
namespace SimpleFactorySample
{
class Program
{
static void Main(string[]args)
{
Chart chart;
//读取配置文件
string chartStr=ConfigurationManager.AppSettings["chartType"];
chart = ChartFactory.GetChart(chartStr); //通过静态工厂方法创建产品
chart.Display();
Console.Read();
}
}
}
chart = ChartFactory.GetChart(chartStr);
三、使用反射
反射是一种在运行时动态创建对象的机制,通过使用System.Reflection,可以在运行时通过类型信息创建对象,比如:
ClassName obj = (ClassName)Activator.CreateInstance(typeof(ClassName));
但是这里我们得说一下反射得原理:
反射的原理基于.NET平台中的元数据和类型信息。每个类型在编译后都会包含一些元数据,这些元数据描述了类型的结构、成员、方法等信息。当我们使用反射时,运行时环境通过读取这些元数据来获取类型的详细信息,然后我们可以使用这些信息来创建对象、调用方法等操作。
这里可以说一下typeof和反射得关系,typeof运算符是获取了类型得元数据,这是在某些情况下可能用于编译时的类型检查或获取静态信息,而不涉及动态的成员访问或操作
Type type = typeof(MyClass);
MethodInfo method = type.GetMethod("MyMethod");
而使用反射是这样得
using System;
using System.Reflection;
public class MyClass
{
public void MyMethod()
{
Console.WriteLine("Hello, Reflection!");
}
}
public class Program
{
public static void Main()
{
Type type = typeof(MyClass);
object obj = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("MyMethod");
method.Invoke(obj, null);
}
}
使用Activator.CreateInstance
方法创建了 MyClass
的实例 obj,
四、使用对象克隆
如果实现了ICloneable接口,使用Clone方法来创建对象副本:
ClassName obj = originalObj.CLone() as ClassName;
五、使用序列化和反序列化
将对象序列化转化为字节流或其他格式,然后反序列化位对象,可以创建对象的副本,这通常用于对象的深度复制或在进程之间传输对象,比如JSON或XML的序列化和反序列化
有关序列化和反序列化,可以说的再多一些,在C#中,序列化包括二进制序列化(BinaryFormatter),XML序列化(XML Serialization),JSON序列化(JSON Serialization),
在Unity中,当一个Private对象前加上[Serializable]后,序列化器就会使用反射来获取类型得所有字段和属性,并对它们进行序列化,底层就是通过反射来获取类或者对象的信息