抽象工厂的继续学习

抽象工厂模式

1)抽象工厂模式(Abstract Factory,提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。

2)以不同数据库中的两种表为例

3)适用性

在以下情况下可以试用AbstractFactory模式

  • 一个系统要独立于它的产品的创建、组合和表示时。
  • 一个系统要多个产品系列中的一个来配置。
  • 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现。

 

4)抽象工厂模式的优缺点

优点:

  • 具体产品从客户端代码中分离出来,
  • 容易改变产品的系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易.
  • 将一个系列的产品族统一到一起创建。

缺点:

产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口。(如果增加项目表Project,就需要增加三个类,IprojectSqlserverProjectAcessProject,还需要改IfactorySqlserverFactoryAcessFactory才可以完全实现。要改三个类,这就太糟糕了。)

5)用简单工厂来改进抽象工厂


代码:

classDataAccess

    {

        private static readonly string db ="Sqlserver";

 

        public static IUser CreateUser()

        {

            IUser result = null;

            switch (db)

            {

                case "Sqlserver":

                    result =new SqlserverUser();

                    break;

                case "Access":

                    result = new AccessUser();

                    break;

            }

            return result;

        }

 

        public static IDepartmentCreateDepartment()

        {

            IDepartment result = null;

            switch(db)

            {

                case "Sqlserver":

                    result=newSqlserverDepartment ();

                    break;

                case "Access":

                    result  =new AccessDepartment ();

                    break;

                     

            }

            return result;

            }

    }

 

 

 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();

        }

6)用反射+抽象工厂的数据访问程序(根据字符串去哪个地方应该要实例化那一个类,这样可以去掉Case语句)

classDataAccess

    {

        private static readonly stringAssemblyName = "抽象工厂五";

        private static readonly string db ="Sqlserver";

 

        public static IUser CreateUser()

        {

            string className = AssemblyName +"." + db + "User";

            return(IUser)Assembly.Load(AssemblyName).CreateInstance(className);

        }

        public static IDepartmentCreateDepartment()

        {

            string className = AssemblyName +"." + db + "Departemnt";

            return(IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);

        }

    }

6)用反射+配置文件实现数据访问程序(来解决更改数据库的问题。)

配置文件:

<?xmlversion="1.0" encoding="utf-8" ?>

<configuration>

    <startup>

        <supportedRuntimeversion="v4.0" sku=".NETFramework,Version=v4.5" />

    </startup>

<appSettings >

<add key ="DB" value="Sqlserver"/>

</appSettings>

</configuration>

 

在开头添加  using System.configuration,有时候还是提示错误,这就需要添加引用+程序集中找到system.configuration勾选上即可

 

在代码中添加配置文件(改DB赋值即可):

privatestatic readonly string db = ConfigurationManager.AppSettings["DB"];


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值