文章出處

第2篇 設計模式的實現與使用

第六章 簡單工廠

        面向接口編程要求針對接口,而不是具體的實現。有一個問題是,盡管編程是面向接口,但執行時的操作需要實例化后的對象,而實例化必須要針對具體的類。若直接實例化,則破壞了面向接口的編程原則。解決的方法就是通過一個專門實例化的類來獲得具體的對象,通常將這個類稱為“工廠”,將與實例化相關的模式稱為“創建型模式”。
1.意圖
        簡單工廠的作用是實例化對象,而不需要客戶了解這個對象屬于哪個具體的子類。
2.使用場合
        簡單工廠實例化的類具有相同的接口,類類有限并且基本不需要擴展。
3..NET實現
        通常簡單工廠不需要實例化,而是采用靜態方法。
·抽象類與接口優劣性的討論:
        如果需要被實例化的子類有大量相同代碼,可考慮采用抽象類,可以減少代碼的重復。然而這樣做的缺點是擴展性不好,子類之間存在潛在的耦合性。因此通常可考慮采用接口代替抽象類。
·代碼框架

//交通工具是一個必須繼承的基類
public  abstract class Vehicle
{
    
protected string m_TypeName;
    
public string TypeName
    {
        
get
        {
            
return m_TypeName;
        }
        
set
        {
            m_TypeName
=Value;
        }
    }
    
public abstract string Go()
}

//汽車是交通工具的子類
public class Car:Vehicle
{
    
public Car()
    {
        m_TypeName
="汽車";
    }
    
public override string Go()
    {
        
return "汽車在公路上開";
    }
}

//火車是交通工具的子類
public class Train:Vehicle
{
    
public Car()
    {
        m_TypeName
="火車";
    }
    
public override string Go()
    {
        
return "火車在鐵軌上開";
    }
}


//船是交通工具的子類
public class Boat:Vehicle
{
    
public Car()
    {
        m_TypeName
="";
    }
    
public override string Go()
    {
        
return "船在水上走";
    }
}

public class CreateAVehicle
{
    
//將創建方法定義為靜態
    public static Vehicle CreateAVehicle(string typeid)
    {
        Vehicle v;
        
//根據參數確定需要創建的對象
         switch(typeid.ToLower())
        {
            
case "car":
                  v
=new Car();
                  
break;
            
case "train":
                  v
=new Train();
                  
break;
            
case "boat":
                  v
=new Boat();
                  
break;
        }
        
return v;
    }
}
4.應用
        對于數據庫類型的不同,可將其統一封裝于一個簡單工廠中,方便使用及日后的維護。
        對于程序的配置信息的保存位置(如:配置文件,注冊表,數據庫等),也可用簡單工廠封存裝。

第七章 工廠方法模式
        工廠方法是粒度很小的設計模式,因為模式的表現只是一個抽象的方法。工廠方法經常用于創建與某個類相關的類的實例。
1.意圖
        定義一個用于創建對象的接口,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到子類,這個接口所指的是一個抽象方法。該方法說明需要創建一個對象,但并不給出具體的創建方法和創建什么類型的對象。
·代碼:
using System;
namespace CSharpCreator
{
    
public abstract class Creator
    {    
        
public abstract production FactoryMethod();    
    }
    
public class ConcreteCreator:Creator
    {
        
public override production FactoryMethod()
        {
            
return new ConcreteProduction();
        }
    }
}
2.使用場合
        當一個類不知道它所必須創建對象的類或一個類希望由子類來指定它所創建的對象時。
3.應用——獲得多媒體播放對象
        希望同一個架構既可以采用RealPlay播放器,也可以用MSMedia Player播放器。
·代碼框架(省略了系統自動生成的代碼)
public abstract class BasePlayForm:System.Windows.Forms.Form
//播放器聲明為符合AudioPlayer接口
protected AudioPlayer mmply;
//工廠方法,在子類中定義具體的播放器
protected abstract AudioPlayer GetMP();
//打開媒體文件
private void mnOpen_Click(object sender, ImageClickEventArgs e)
{
        
if(this.OpenFileDialog1.ShowDialog==DialogResult.OK)
    {
        mmply
=GetMP();
        mmply.Source
=this.OpenFileDialog.FileName;
    }
}
//播放
private void mnPlay_Click(object sender, ImageClickEventArgs e)
{
        mmply.DoPlay();
}
//暫停
private void mnPause_Click(object sender, ImageClickEventArgs e)
{
        mmply.DoPause();
}
//停止
private void mnStop_Click(object sender, ImageClickEventArgs e)
{
        mmply.DoStop();
}
以下是采用RealPlay和MS Media Player播放器的代碼(分別繼承自BasePlayForm類)
public class PlayMedia:BasePlayForm
{
    
protected override AudioPlayer GetMP()
    {
        
return new MediaPlayer();
    }
}

public class PlayReal:BasePlayForm
{
    
protected override AudioPlayer GetMP()
    {
        RealAudioPlayClass c
=new RealAudioPlayerClass(this);
                
return c;
    }
}

·工廠方法使類中的代碼不依賴于它必須創建的類,代碼只要知道它需要創建的類的接口。工廠方法的缺點是新增加一個需要創建的類,就需要增加一個相應的子類。

不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()