zoukankan      html  css  js  c++  java
  • 设计模式之—抽象工厂模式<Abstract Factory pattern>

         

    抽象工厂模式处理的是多表业务。工厂方法模式处理的单表的多项业务。

    本例以选择操作数据库(SQL、 ACCESS)为例,解除与数据库的耦合。方便更改数据库的选取

    本例结构图如下:

    工厂接口类(IFactory)

    namespace FactoryMethodPatternDB.CLASS
    {
        interface IFactory
        {
            IUser CreateUser();
            //IDepartment CreateDept();
        }
    }
    View Code

    SQL操作User表的工厂(SqlServerFactory):继承于工厂接口类(IFactory)

    namespace FactoryMethodPatternDB.CLASS
    {
        class SqlServerFactory:IFactory
        {
            public IUser CreateUser()
            {
                return new SqlServerUser();
            }
        }
    }
    View Code

    ACCESS操作User表的工厂(AccessFactory):继承于工厂接口类(IFactory)

    namespace FactoryMethodPatternDB.CLASS
    {
        class AccessFactory:IFactory
        {
            public IUser CreateUser()
            {
                return new AccessUser();
            }
        }
    }
    View Code

    用户表(User)接口类(IUser)

    namespace FactoryMethodPatternDB.CLASS
    {
        interface IUser
        {
            void Insert(User user);
            void GetUser(string id);
        }
    }
    View Code

    SQL处理User表的业务(SqlServerUser):继承于用户表接口(IUser)

    namespace FactoryMethodPatternDB.CLASS
    {
        class SqlServerUser:IUser
        {
            public void Insert(User user)
            {
                Console.WriteLine("在User表中插入一条数据{0}!",user);
            }
    
            public void GetUser(string id)
            {
                Console.WriteLine("通过{0}来查找数据!",id);
            }
        }
    }
    View Code

    ACCESS处理User表的业务(AccserverUser):继承于用户表接口(IUser)

    namespace FactoryMethodPatternDB.CLASS
    {
        class AccessUser:IUser
        {
            public void Insert(User user)
            {
                Console.WriteLine("在{0}表中插入数据!Access数据库",user);
            }
            public void GetUser(string id)
            {
                Console.WriteLine("通过{0}查找数据库表!Access数据库",id);
            }
        }
    }
    View Code

    封装User表属性:

    namespace FactoryMethodPatternDB.CLASS
    {
        class User
        {
            private string id;
            private User user;
    
            /// <summary>
            /// 用户表对象
            /// </summary>
            public User User1
            {
                get { return user; }
                set { user = value; }
            }
            /// <summary>
            /// ID号
            /// </summary>
            public string Id
            {
                get { return id; }
                set { id = value; }
            }
        }
    }
    View Code

    测试类(TestMain)

    namespace FactoryMethodPatternDB
    {
        class TestMain
        {
            static void Main(string[] args)
            {
                //User user = new User();
                //IFactory sqlFactory = new SqlServerFactory();
                //IUser iUser = sqlFactory.CreateUser();
    
                //iUser.Insert(user);
                //user.Id = "name";
                //iUser.GetUser(user.Id);
    
                User user = new User();
                IFactory accFactory = new AccessFactory();
                IUser iUser = accFactory.CreateUser();
                iUser.Insert(user);
                iUser.GetUser("ID");
    
                Console.ReadLine();
            }
        }
    }
    View Code

    上述为工厂方法模式的实现:抽象方法模式即在此基础上再加入其他表的业务逻辑操作

    在上述的 工厂接口类(IFactory)里添加部门表的(Department)方法即

    namespace FactoryMethodPatternDB.CLASS
    {
        interface IFactory
        {
            IUser CreateUser();
    
            IDepartment CreateDept();
        }
    }
    View Code

    更改SQL操作Department表的工厂、ACCESS操作Dapartment表的工厂

    SQL操作工厂(SqlServerFactory):继承于工厂接口类(IFactory)

    namespace FactoryMethodPatternDB.CLASS
    {
        class SqlServerFactory:IFactory
        {
            public IUser CreateUser()
            {
                return new SqlServerUser();
            }
    
            public IDepartment CreateDepart()
            {
                return new SqlServerDepartment();
            }
        }
    }
    View Code

    ACCESS操作工厂(AccessFactory):继承于工厂接口类(IFactory)

    namespace FactoryMethodPatternDB.CLASS
    {
        class AccessFactory:IFactory
        {
            public IUser CreateUser()
            {
                return new AccessUser();
            }
    
            public IDepartment CreateDepart()
            {
                return new AccessDepart();
            }
        }
    }
    View Code

    添加部门表(Department)的接口,

    添加SQL处理Department表业务的方法、ACCESS处理Department表业务的方法

    测试类中: IFactory sqlFactory = new Sql

    要么忍,要么狠,要么滚!
  • 相关阅读:
    变量定义和声明的差别(整理)
    堆栈指针理解
    HDU 4349 Xiao Ming&#39;s Hope
    iOS 8中CLLocationManager及MKMapView showUserLocation失败的解决的方法
    Ant命令行操作
    linux awk命令详细使用方法
    mysql 修改[取消]timestamp的自动更新
    cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第六步---炮台&amp;点击炮台加入英雄&amp;英雄升级
    SendMessage、PostMessage原理
    poj 2104 K-th Number 主席树+超级详细解释
  • 原文地址:https://www.cnblogs.com/zxd543/p/3250235.html
Copyright © 2011-2022 走看看