Visual Studio在2010版開始,又把製作UML工具加入,這裡介紹的以VS2012繪製 Gof裡的Factory Pattern的UML類別圖,使用的語言為 C#,並在最後用Visual Stutio直接產生程式碼。在這之前我們先了解一下Factory Pattern
Factory Method
定義一個介面用以產生物件,但是要產生的物件為何?可以由繼承該介面的子類別來決定並產生
底下是Factory Pattern的類別圖;最上面的介面,有些人會用abstract類別,效果是一樣的
參與類別 有兩類:
1. 被建立的類別:圖的左邊有兩個類別
--Product是個介面
--ConcretProduct,ConcretProduct可以很多不同的實體,但都需繼承Product
2. 建立者:圖的右邊有兩個類別
--Creator是個介面,FactoyMethod預先定義的方法
--ConcreteCreater是繼承Creator的實體類別,這裡必需要實作FactoyMethod,這個 Method會回傳 一個新建立的ConcretProduct物件,初學者比較會搞混的是,回傳值的型態是Product,為何可傳回ConcretProduct物件,這是正是物件導向的多型特色,隱含式轉型到base類別(Produc)是安全的,因此ConcretProduct回傳時自動轉型到Product。實作
- 新增一模型專案
- 拖拉兩個介面,分別命名為Product和Creator,Creator,在作業的地方按enter,並輸入FactoryMethod,FactoryMethod的Return選[專案名稱]: Product
- 再拖拉兩個類別,分別命名為ConcretProduct和ConcretCreator,點繼承圖示,由ConcretProduct拉到Product,ConcreteCreator拉到Creator,表示繼承上方的介面,最後點關連
圖示,由ConcretCreator拉到ConcretProduct,就完成下圖 - 最後在模型圖的空白處,按右鍵,選產生程式碼
- 完成後,會新增一個XXXLib的專案,四個類別的程式碼就在裡面囉
- 最後打開ConcreteCreator.cs,把return 新ConcreteProduct輸入
public class ConcreteCreator : Creator
{
public override Product FactoryMethod()
{
//throw new System.NotImplementedException();
return new ConcreteProduct();
}
}
這裡Factory Method的程式碼就完成了。以下是所有類別程式碼:
//Creator.cs
public abstract class Creator
{
public abstract Product FactoryMethod();
}
//ConcreteCreator.cs
public class ConcreteCreator : Creator
{
public override Product FactoryMethod()
{
//throw new System.NotImplementedException();
return new ConcreteProduct();
}
}
//Product.cs
public abstract class Product
{
}
//ConcreteProduct.cs
public class ConcreteProduct : Product
{
}
封裝-Package
如果我們要將類別以功能別或其他角度進行封裝(Package),可依以下實作
- 工具箱拉一個封裝
- 把先前製作的類別,拉進去,並命名為pckFactory
- 在模型圖的空白處,按右鍵,選產生程式碼
,程式碼會多一層folder
- 打開程式碼可以發現多了Name Space,因為UML的Package相當於.NET的Namespace,請參考
說明
namespace pkgFactory
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class ConcreteCreator : Creator
{
public virtual Product FactoryMethod()
{
throw new System.NotImplementedException();
}
}
}
參考
UML Class Diagrams: Guidelines
Creational Patterns: Prototype, Factory Method, and Singleton
請教,如何繪制產生abstract的類別,我一直只能產生interface…但看你的圖,是可以產生abstract 類別。該如何做呢?
回覆刪除