设计模式<2>------工厂模式和抽象工厂模式------创建型

简单工厂:

拿我们的简单三层举例子

先定义dal层

class Dal 
{ 
     public void Delete() 
     {  
     }
}

工厂类

class Factory 
{ 
       //这样掉的好处是  当dal层发生变化的时候不需要去每个调用的地方修改对应的实例,只需要在工厂里面修改对应的实例就行。 
       //例如Dal的名字换成DAL  这个时候只需要改动工厂里面对应的实例名称即可。 
       public static Dal CreateInstance() 
       { 
           return new Dal(); 
       } 
}

在BLL层中实例化Dal层对象

class Bll 
{ 
        Dal dal = Factory.CreateInstance(); 
}

这样的好处是当dal层名称发生变化时,只需要改动一处即可,调用者无需关系调用的对象!

优点:可以提高程序的扩展性,减少修改量!

 

抽象工厂(一般配合反射或者配置文件来用):

场景我们的系统要同时支持两个数据库  SqlServer 跟Oracle数据库  并且不同的环境要进行随时切换。

看下面的代码:

interface ISqlServer
{
        //数据库添加操作
        public void Add();
}

interface IOracle
{
        //数据库添加操作
        public void Add();
 
}
     
class SqlServer : ISqlServer
{
        public void Add()
        {
            Console.WriteLine("SqlServer添加操作");
        }
}

class Oracle : IOracle
{
        public void Add()
        {
            Console.WriteLine("Oracle添加操作");
        }
}
          
class SqlServerFactory : AbstractFactory
{
        public ISqlServer GetSqlServer()
        {
            return new SqlServer();
        }
 
}

class OracleFactory : AbstractFactory
{
 
        public IOracle GetOracle()
        {
            return new Oracle();
        }
}
     
interface AbstractFactory
{
      public   ISqlServer GetSqlServer();
      public   IOracle GetOracle();
 
}
     
static void Main(string[] args)
{
            //调用的场景
            AbstractFactory sqlServer = new SqlServerFactory();
            sqlServer.GetSqlServer().Add();
            AbstractFactory oracleServer = new OracleFactory();
            sqlServer.GetOracle().Add();
 
}
 

这样调用还是觉得有点麻烦,我们可以用反射来实例化对象。 我们在来完善一下AbstractFactory。

public   abstract AbstractFactory
{
        public static AbstractFactory GetInstance()
        {
            string factoryName = System.Configuration.ConfigurationManager.AppSettings["factoryName"];
 
            AbstractFactory instance;
 
            if (factoryName != "")
                instance = (AbstractFactory)Assembly.Load(factoryName).CreateInstance(factoryName);
            else
                instance = null;
 
 
            return instance;
        }
        public abstract ISqlServer GetSqlServer();
        public abstract IOracle GetOracle();
 
}
     
//调用
static void Main(string[] args)
{
    
            AbstractFactory.GetInstance().GetOracle().Add();
            AbstractFactory.GetInstance().GetSqlServer().Add();
}

//配置config文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="factoryName" value="SqlServerFactory"></add>
    </appSettings>
</configuration>
posted @ 2017-04-16 11:54  阿墨0925  阅读(125)  评论(0编辑  收藏  举报