• 抽象工厂模式


    抽象工厂模式特点:

    • 围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。
    • 抽象工厂模式是相较工厂模式而言的,对工厂模式更深的抽象,更高内聚,更低耦合

    使用场景:

    • 与工厂模式相同 ,只是出现了工厂的工厂

    工厂模式VS抽象工厂模式

      如果说工厂模式是线那么抽象工厂就是面,如果说工厂模式是面那么抽象工厂就是体,抽象工厂的存在就是比工厂模式高一个维度

    实现:

    namespace 抽象工厂模式
    {
        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();
            }
        }
    
        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 Department
        {
            private int _id;
            public int ID
            {
                get { return _id; }
                set { _id = value; }
            }
    
            private string _deptName;
            public string DeptName
            {
                get { return _deptName; }
                set { _deptName = value; }
            }
        }
    
        interface IUser
        {
            void Insert(User user);
    
            User GetUser(int id);
        }
    
        class SqlserverUser : IUser
        {
            public void Insert(User user)
            {
                Console.WriteLine("在Sqlserver中给User表增加一条记录");
            }
    
            public User GetUser(int id)
            {
                Console.WriteLine("在Sqlserver中根据ID得到User表一条记录");
                return null;
            }
        }
    
        class AccessUser : IUser
        {
            public void Insert(User user)
            {
                Console.WriteLine("在Access中给User表增加一条记录");
            }
    
            public User GetUser(int id)
            {
                Console.WriteLine("在Access中根据ID得到User表一条记录");
                return null;
            }
        }
    
        interface IDepartment
        {
            void Insert(Department department);
    
            Department GetDepartment(int id);
        }
    
        class SqlserverDepartment : IDepartment
        {
            public void Insert(Department department)
            {
                Console.WriteLine("在Sqlserver中给Department表增加一条记录");
            }
    
            public Department GetDepartment(int id)
            {
                Console.WriteLine("在Sqlserver中根据ID得到Department表一条记录");
                return null;
            }
        }
    
        class AccessDepartment : IDepartment
        {
            public void Insert(Department department)
            {
                Console.WriteLine("在Access中给Department表增加一条记录");
            }
    
            public Department GetDepartment(int id)
            {
                Console.WriteLine("在Access中根据ID得到Department表一条记录");
                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);
            }
        }
    
    }

    配置文件中:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <appSettings>
            <add key="DB" value="Sqlserver"/>
        </appSettings>
    </configuration>

    本例中把具体使用哪个数据库抽象到了配置文件中,属于抽象工厂模式的最高级应用场景。

    运行结果:

    DB为Sqlserver时

    DB为Access时

  • 相关阅读:
    MAXSCRIPT 连数据库(转)
    Docker安装部署ELK教程 (Elasticsearch+Kibana+Logstash+Filebeat)
    ArrayList知识点
    HashMap知识点
    使用docker 安装nacos
    记录docker 安装sonarqube和安装的一些坑
    sql优化
    Centos7下安装Docker
    使用docker安装gitlab
    docker安装jenkins
  • 原文地址:https://www.cnblogs.com/xbblogs/p/8309533.html
Copyright © 2020-2023  润新知