【软考学习】设计模式——抽象工厂

【背景】
设计模式是非常重要的一块知识,每个设计模式都值得深入了解和学习。
【内容】
工厂方法设计模式总结:
    一、定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    二、UML结构图:


    三、代码实现:     

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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; }
        }
    }
    //例子,新增用户和得到用户为例
    //IUser接口,用于客户端访问,解除与具体数据库访问的耦合。
    interface IUser
    {
        void Insert(User user);
        User GetUser(int id);
    }
    //SQLserver类,用于访问SQL Sever的User
    class SqlserverUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在SQL Server中给User表添加一条记录");
        }
        public User GetUser(int id)
        {
            Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
            return null;
        }
    }
    //AccessUser类,用于访问Access的User
    class AccessUser:IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在Access中给User表添加一条记录");
        }
        public User GetUser(int id)
        {
            Console.WriteLine("在Access中根据ID得到User表一条记录");
            return null;
        }
    }
    //IFactory接口,定义一个创建访问User表对象的抽象的工程接口
    interface IFactory
    {
        IUser CreateUser();
        IDepartment CreateDepartment();
    }

    //增加了部门表(Department)
    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;}
        }
    }

    //IDepartment接口,用于客户端访问,解除与具体数据库访问的耦合。
    interface  IDepartment
    {
        void Insert(Department department);
        Department GetDepartment(int id);
    }
    //SQLserverDepartment类,用于访问SQL Server的Department
    class SqlserverDepartment:IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在SQL Server中给Department表增加一条记录");
        }
        public Department GetDepartment(int id)
        {
            Console.WriteLine("在SQL server中根据ID得到的Department表一条记录");
            return null;
        }
    }
    //AccessDepartment类,用于访问Access的Department
    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 db="Sqlserver";
        //private static  readonly string db="Access"//数据库的名称,可以替换成Access,直接显示
        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 IDepartment CreateDepartment()
        {
            IDepartment result=null;
            switch (db)
            {
                case "Sqlserver":
                    result =new SqlserverDepartment ();
                    break;
                case "Access":
                    result =new AccessDepartment();
                    break ;
            }
            return result ;
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值