今天说抽象工厂有网友提出我闲扯太多, 不好意思, 这个毛病改不掉了, 请多多谅解
开始继续闲扯
1. 在 C 语言中 void* 的指针可以转成任意类型的指针在 C# 中存在有类型检查机制, 且子类转成基类并不会丢数据因为继承本意重在减少重复编写, 表示已经拥有
2. 在旁边出主意的或领导或其他人最爱出主意但是这个主意是否可行, 需要实践, 所以伟人说实践是检验真理的唯一标准可以把别人出的主意, 给的方法理解成抽象的方法它只是表示一个意思去具体实现这个意思的方法就是真实的方法, CPU 肯定会找这个意思的具体方法
3. 我们解决问题, 一定要先大概分析下需要做的步骤这样可以把步骤定义成接口或抽象方法黑猫白猫逮着老鼠就是好猫, 一个问题最少有三种解决办法故具体类有多种变化
把工厂定义成抽象的, 抽象的工厂只能生产抽象的产品,(先画饼, 空口套白狼)
具体的工厂生产具体的产品
由于子类的引用可以用基本的引用表示, 所以变成了只用基类互相交互交涉是领导与领导之间交涉, 真正实施的还是小兵, 领导代表小兵拿主意
经常有人问我, 接口与抽象有什么区别, 从偏重方面说接口偏重于约定, 抽象偏重于继承
在此, 我不再自己编写代码, 直接拿来例子 (备注: 以后这样的例子只是研究学习用, 所有权归原作者) 分析:
- // 领导出的主意, 要求的约定
- interface IUser
- {
- void Insert(User user);
- User GetUser(int id);
- }
- //A 小兵是这样实现的
- class SqlserverUser : IUser
- {
- public void Insert(User user)
- {
- Console.WriteLine("在 Sqlserver 中给 User 表增加一条记录");
- }
- public User GetUser(int id)
- {
- Console.WriteLine("在 Sqlserver 中根据 ID 得到 User 表一条记录");
- return null;
- }
- }
- //B 小兵是这样实现的
- class AccessUser : IUser
- {
- public void Insert(User user)
- {
- Console.WriteLine("在 Access 中给 User 表增加一条记录");
- }
- public User GetUser(int id)
- {
- Console.WriteLine("在 Access 中根据 ID 得到 User 表一条记录");
- return null;
- }
- }
- // 哪个小兵掏领导欢心采用谁的办法, 这可是活动的, 不是固定死的
- class DataAccess
- {
- private static readonly string AssemblyName = "抽象工厂模式";
- private static readonly string db = ConfigurationManager.AppSettings["DB"];
- public static IUser CreateUser()
- {
- string className = AssemblyName + "." + db + "User";
- return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
- }
- public static IDepartment CreateDepartment()
- {
- string className = AssemblyName + "." + db + "Department";
- return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
- }
- }
- // 程序 = 数据 + 算法, 实体作为数据的承载着
- class User
- {
- private int _id;
- public int ID
- {
- get { return _id; }
- set { _id = value; }
- }
- private string _name;
- public string Name
- {
- get { return _name; }
- set { _name = value; }
- }
- }
- // 主方法调用工厂创建真正的实践想法的对象
- class Program
- {
- static void Main(string[] args)
- {
- User user = new User();
- Department dept = new Department();
- IUser iu = DataAccess.CreateUser();
- iu.Insert(user);
- iu.GetUser(1);
- IDepartment id = DataAccess.CreateDepartment();
- id.Insert(dept);
- id.GetDepartment(1);
- Console.Read();
- }
- }
总结: 基对象的引用, 可以表示子类型的引用, 正如 void * 指针可以表示所有类型的指针, 但是堆中的对象还是真正的对应对象
来源: http://www.bubuko.com/infodetail-2535893.html