抽象工廠和網路範例
任務 : 分別從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
寫這個系列真的很花時間(雖然目前才三篇),不過也學到許多,真佩服網路上很多大神的無私分享,佩服佩服。
新手上路,若有錯誤請不吝嗇指教,謝謝。