这两天在修改网络消息规则,看到消息的实例化不就是简单工厂模式来改进抽象工厂模式来做的么。顺便就再来看看抽象工厂模式,这里面用到了反射,因为反射的原因我就简单的在unity工程下实现以下这个实例。至于反射的什么原因,可以看一下我的这篇文章的最下面。
是什么
提供一个接口与工厂相互依赖,而不是提供具体的类。概念就是这一句了。
来个图解
可以看到这里相互依赖的接口就是IMessage,我们通过这个再来返回实例,Factory里面的msgDic是用来存储消息名称与消息ID的。我们在这里就先把这个存储好。
具体实现
IMessage:
public interface IMessage
{
void Print();
}
Message1:
public class Message1:IMessage
{
public int id;
public string name;
public void Print()
{
Debug.Log("this Message1");
}
}
Message2:
public class Message1:IMessage
{
public int id;
public string name;
public void Print()
{
Debug.Log("this Message1");
}
}
Factory:
public class Factory
{
private readonly Dictionary<int,string> msgDic;
public Factory()
{
msgDic=new Dictionary<int,string>();
msgDic.Add(1,"Message1");
msgDic.Add(2,"Message2");
}
public IMessage CreateMessage(int id)
{
if(!msgDic.ContainsKey(id))
{
return null;
}
return (IMessage)Assembly.GetCallingAssembly().CreateInstance(msgDic[id]);
}
}
Client:
void Start()
{
var factory=new Factory();
factory.CreateMessage(1).Print();
factory.CreateMessage(2).Print();
}
结果:
后面再对消息赋值就可以了。
当然这个模式不仅仅是用于这方面,工厂还可以生产其他的嘛,毕竟是世界大工厂嘛。