设计形式初探(二)——既然创建时必然的,所以它独立了

设计模式初探(二)——既然创建时必然的,所以它独立了!

        面向对象设计,一个必不可少的步骤是“实例化”,如果将实例化与具体的实现紧密地结合在一起……简单的创建,当然这是没有问题的,但是,如果我们不是简单的创建呢,我们需要改变具体的算法,需要扩展算法的种类,需要系统在改变之后还是以前的样子运行!那么,问题就会变得复杂,多变!

        在创建型的几个设计模式中,将具体算法的实现与实例化分离,工厂方法是这方面的典范,其他的创建型设计模式起到扩展和辅助的作用!

 

设计形式初探(二)——既然创建时必然的,所以它独立了

 

        在书中举得那些例子,都很有趣,大家可以好好看看,在这里咱们说说一些扩展的知识。

 

        反射:我个人肤浅的理解是,应用程序在运行时,可以动态地获得一个类型的属性,方法,事件等信息,这样就可以在工厂中动态地创建一个对象了!

 

        c#代码:

Assembly.Load("程序集") //Assembly.LoadFile("外部调用的动态库")加载程序集,返回类型是一个Assembly

 

        实际应用:

 

 

//引入反射
using System.Reflection;

//引入config配置文件
using System.Configuration ;


  //反射优化抽象工厂

    //根据配置文件选择创建查询方式
    class DateAccess
    {
        private static readonly string AssemblyName = "shujuku";

        //利用配置文件:1,添加引用system.configuration ; 2, using system.configuration 
        //读取配置文件app.config里的DB
        private static readonly string db = ConfigurationManager.AppSettings["DB"];
        //private static readonly string db = "Sqlserver";

        //静态函数创建用户表
        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);
        }
    }

 

 

        在程序设计中,创建型模式已经给我们带来了意想不到的好处,让我们的工作更轻松,简单,但是不要忘了一种模式只是解决一种特定的问题,下次我们将介绍更多的模式,解决更多的问题!