设计模式之抽象工厂模式

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

最大的好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体工厂即可使用不同的产品配置。

  他使具体创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离。  

下面的代码还使用了反射与XML.

代码如下:

 

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Configuration;

namespace 设计模式之抽象工厂模式2
{
    class Deparentment{

    }
    interface IDepartment
    {
        void Insert(Deparentment department);
        Deparentment GetDepartment();
    }
    class SqlserverDepartment : IDepartment
    {
       public void Insert(Deparentment deparent)
        {
            Console.WriteLine("在SQL中为deparent表增加了一条记录");
        }
       public Deparentment GetDepartment()
        {
            Console.WriteLine("从SQL中的deparent表中取出了一条记录");
            return new Deparentment();
        }
    }
    class AccessDeparent:IDepartment
    {
       public void Insert(Deparentment deparent)
        {
            Console.WriteLine("在Access中为deparent表增加了一条记录");
        }
      public  Deparentment GetDepartment()
        {
            Console.WriteLine("从Access中的deparent表中取出了一条记录");
            return new Deparentment();
        }
    }
    class User
    {

    }
    interface IUser
    {
        void Insert(User u);
        User GetUser();
    }
    class SqlUser:IUser
    {
        public void Insert(User u)
        {
            Console.WriteLine("在Sql中向User表中添加了一条记录");
        }
        public User GetUser()
        {
            Console.WriteLine("从SQL中的User表中取出了一条记录");
            return new User();
        }
    }
    class AccessUser:IUser
    {
        public void Insert(User u)
        {
            Console.WriteLine("在Accesss中向User表中添加了一条记录");
        }
        public User GetUser()
        {
            Console.WriteLine("从Access中的User表中取出了一条记录");
            return new User();
        }
    }
    class DataAccess
    {
        private static readonly string AssemblyName = "设计模式之抽象工厂模式2";
        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 CreateDeparent()
        {
            string className = AssemblyName + "." + db + "Department";
            return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            User user = new User();
            Deparentment dept = new Deparentment();
            IUser iu = DataAccess.CreateUser();
            iu.Insert(user);
            iu.GetUser();
            Console.Read();
        }
    }
}
复制代码

 

XML文件:

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
    <add key="DB" value="Access"/>
  </appSettings>
</configuration>
复制代码

运行结果:

 

posted @   张杨  阅读(395)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示