2013年5月16日

使用VS2012繪製Factory Pattern的UML類別圖和產生程式碼

Visual Studio在2010版開始,又把製作UML工具加入,這裡介紹的以VS2012繪製 Gof裡的Factory Pattern的UML類別圖,使用的語言為 C#,並在最後用Visual Stutio直接產生程式碼。在這之前我們先了解一下Factory Pattern

Factory Method

定義一個介面用以產生物件,但是要產生的物件為何?可以由繼承該介面的子類別來決定並產生

底下是Factory Pattern的類別圖;最上面的介面,有些人會用abstract類別,效果是一樣的

image

參與類別 有兩類:
1. 被建立的類別:圖的左邊有兩個類別
--Product是個介面
--ConcretProduct,ConcretProduct可以很多不同的實體,但都需繼承Product

2. 建立者:圖的右邊有兩個類別
--Creator是個介面,FactoyMethod預先定義的方法
--ConcreteCreater是繼承Creator的實體類別,這裡必需要實作FactoyMethod,這個 Method會回傳 一個新建立的ConcretProduct物件,初學者比較會搞混的是,回傳值的型態是Product,為何可傳回ConcretProduct物件,這是正是物件導向的多型特色,隱含式轉型到base類別(Produc)是安全的,因此ConcretProduct回傳時自動轉型到Product。

實作

  1. 新增一模型專案
    image
  2. 拖拉兩個介面,分別命名為Product和Creator,Creator,在作業的地方按enter,並輸入FactoryMethod,FactoryMethod的Return選[專案名稱]: Product
    image
  3. 再拖拉兩個類別,分別命名為ConcretProduct和ConcretCreator,點繼承圖示,由ConcretProduct拉到Product,ConcreteCreator拉到Creator,表示繼承上方的介面,最後點關連
    圖示,由ConcretCreator拉到ConcretProduct,就完成下圖image
  4. 最後在模型圖的空白處,按右鍵,選產生程式碼
    image
  5. 完成後,會新增一個XXXLib的專案,四個類別的程式碼就在裡面囉
    image
  6. 最後打開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),可依以下實作




  1. 工具箱拉一個封裝

    image


  2. 把先前製作的類別,拉進去,並命名為pckFactory

    image


  3. 在模型圖的空白處,按右鍵,選產生程式碼

    ,程式碼會多一層folder


    image


  4. 打開程式碼可以發現多了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

1 則留言:

  1. 請教,如何繪制產生abstract的類別,我一直只能產生interface…但看你的圖,是可以產生abstract 類別。該如何做呢?

    回覆刪除