zoukankan      html  css  js  c++  java
  • 设计模式漫谈之二

    今天说抽象工厂。有网友提出我闲扯太多,不好意思,这个毛病改不掉了,请多多谅解。

    开始继续闲扯。

    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*指针可以表示所有类型的指针,但是堆中的对象还是真正的对应对象。

    又快12点了,晚安。

  • 相关阅读:
    26.列表的循环遍历
    效率比较--链表
    心之距离 再回首 光年之遥远
    效率比较--集合
    效率比较--数组
    哈希表
    栈 VS 队列
    struts1 标签引入
    web 连接池配置
    zip&ftp命令
  • 原文地址:https://www.cnblogs.com/wang-charle/p/8627798.html
Copyright © 2011-2022 走看看