K書記錄-大話設計模式-抽象工廠

抽象工廠和網路範例

任務 : 分別從SqlServer和Access新增或刪除User資料和Department資料

UML :

1.先建立User和Department類別

程式碼 :

    public class User
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }


    public class Department
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }

說明 : 把類別定義出來

 

2.在介面建立所需使用的方法

程式碼 :

    public interface IUser
    {
        User GetUser();
        void InsertUser(User user);
    }


    public interface IDepartment
    {
        Department GetDepartment();
        void InsertDepartment(Department department);
    }

說明 :

將方法先定義出來之後給別的類別繼承

 

3.建立繼承上述介面的類別

程式碼 :

public class SqlServerUser : IUser
    {
        public User GetUser()
        {
            Console.WriteLine("從SQL Server 取得User");
            return new User();
        }
        public void InsertUser(User user)
        {
            Console.WriteLine("新增User到SQL Server內");
        }
    }
    public class AccessServerUser : IUser
    {
        public User GetUser()
        {
            Console.WriteLine("從Access 取得User");
            return new User();
        }
        public void InsertUser(User user)
        {
            Console.WriteLine("新增User到Access內");
        }
    }


    public class SqlServerDepartment : IDepartment
    {
        public Department GetDepartment()
        {
            Console.WriteLine("從SQL Server 取得Department");
            return new Department();
        }
        public void InsertDepartment(Department department)
        {
            Console.WriteLine("新增Department到SQL Server內");
        }
    }
    public class AccessServerDepartment : IDepartment
    {
        public Department GetDepartment()
        {
            Console.WriteLine("從Access 取得Department");
            return new Department();
        }
        public void InsertDepartment(Department department)
        {
            Console.WriteLine("新增Department到Access內");
        }
    }

說明 :

兩種資料庫分別要實現介面所建立的方法

 

4.建立一個工廠介面

程式碼 :

    public interface IFactory
    {
        IUser CreateUser();
        IDepartment CreateDepartment();
    }

說明 :

繼承此介面的類別必須要能夠實現IUser和IDepartment

 

5.資料庫工廠繼承此介面

程式碼 :

    public class SqlServerFactory : IFactory
    {
        public IDepartment CreateDepartment()
        {
            return new SqlServerDepartment();
        }
        public IUser CreateUser()
        {
            return new SqlServerUser();
        }
    }
    public class AccessFactory : IFactory
    {
        public IDepartment CreateDepartment()
        {
            return new AccessServerDepartment();
        }
        public IUser CreateUser()
        {
            return new AccessServerUser();
        }
    }

說明 :

實現介面內敘述的方法

 

6.使用抽象工廠

程式碼 :

        static void Main(string[] args)
        {
            IFactory sqlServerFactory = new SqlServerFactory();
            IUser iUser = sqlServerFactory.CreateUser();
            User userA = new User();
            userA.Name = "userA";
            iUser.InsertUser(userA);
            User userB = iUser.GetUser();

            IDepartment iDep = sqlServerFactory.CreateDepartment();
            Department departmentA = new Department();
            departmentA.Name = "departmentA";
            iDep.InsertDepartment(departmentA);
            Department departmentB = iDep.GetDepartment();
            Console.ReadLine();
        }

說明 :

a.先建立一個SqlServer(或Access)工廠

b.從工廠取出IUser的方法

c.使用IUser的方法可以Get/InsertUser

d.IDepartment同上

 

 

小結 :

抽象工廠其實就是工廠方法的延伸,看一下者兩個工廠的UML:

差在多了對Department的控制,原本只做IUser的工廠變成IDepartment也能實現,經由抽象工廠取得實體工廠,該實體工廠分別可以對User和Department資料作處理。

 

 

網路上找到滿有Fu的範例 :

網址 : https://www.c-sharpcorner.com/article/abstract-factory-design-pattern-in-c-sharp/

智障手機(INormalPhone)

Nokia : Nokia 1600(Nokia1600)

三爽 : Samsung Guru(SamsungGuru)

 

智慧手機(ISmartPhone)

Nokia : Nokia Pixel(NokiaPixel)

三爽 : Samsung Galaxy(SamsungGalaxy)

 

手機工廠(IMoblePhone)

三爽(Samsung)

Nokia(Nokia)

 

MobileClient :

三爽工廠產生智慧手機(GetSmartPhone)就是SamsungGalaxy

Nokia工廠產生智障手機(GetNormalPhone)就是Nokia1600

 

 

寫這個系列真的很花時間(雖然目前才三篇),不過也學到許多,真佩服網路上很多大神的無私分享,佩服佩服。

 

新手上路,若有錯誤請不吝嗇指教,謝謝。