ホームページ  >  記事  >  バックエンド開発  >  0から独学C#09 -- 抽象的なファクトリパターンの例

0から独学C#09 -- 抽象的なファクトリパターンの例

黄舟
黄舟オリジナル
2017-02-04 10:52:461638ブラウズ

1. 適用可能な環境

(主に複数の製品が作成される環境、ソフトウェアに複数のスキン、複数のデータベースがある環境で使用されます)

  • システムは、製品クラスのインスタンスがどのように作成され、結合され、詳細が表現されるかに依存すべきではありません、これはあらゆる種類のファクトリー パターンにとって重要です。

  • システムには複数の製品ファミリーがあり、一度に使用される製品ファミリーは 1 つだけです。

  • 同じ製品ファミリーに属する製品は一緒に使用されるため、この制約をシステムの設計に反映する必要があります。

  • システムはプロダクトクラスライブラリを提供し、すべてのプロダクトは同じインターフェースで表示されるため、クライアントは特定の実装に依存しません

2. パターン定義

抽象ファクトリーパターン: 提供されるインターフェース特定のクラスを指定せずに、一連の関連オブジェクトまたは相互依存オブジェクトを作成します。 Kit パターンとも呼ばれる抽象ファクトリー パターンは、オブジェクト作成パターンです。

3. パターン構造

Abstract Factory パターンには次の役割が含まれます:

  • AbstractFactory: 抽象ファクトリー

  • ConcreteFactory: コンクリートファクトリー

  • AbstractProduct: 抽象プロダクト

  • 製品: 特定の製品

ファクトリ メソッド パターンをより明確に理解するには、最初に 2 つの概念を導入する必要があります:

  • 製品レベルの構造: 製品レベルの構造は、製品の継承構造です。たとえば、抽象クラスはテレビ、そのサブクラスにはハイアール テレビ、ハイセンス テレビ、TCL テレビがあり、抽象テレビとテレビの特定のブランドの間の製品階層構造を形成します。抽象テレビは親カテゴリであり、特定のブランドのテレビはそのサブカテゴリです。

  • 製品ファミリー: 抽象的な工場モデルでは、製品ファミリーとは、同じ工場で生産され、異なる製品レベルの構造にある製品のグループを指します (ハイアール テレビ、ハイアール電化製品工場で製造されたハイアール冷蔵庫、ハイアール テレビなど)はテレビ製品階層に位置し、ハイアール冷蔵庫は冷蔵庫製品階層に位置します。

0から独学C#09 -- 抽象的なファクトリパターンの例

4. コード

プロセスインターフェース

interface IFlow
    {
        IRxAlign CreateRxAlign();

        IDispensing CreateDispensing();
    }

class FlowA : IFlow
    {        public IRxAlign CreateRxAlign()
        {            return new RxAlignA();
        }        public IDispensing CreateDispensing()
        {            return new DispensingA();
        }
    }


class FlowB : IFlow
    {        public IRxAlign CreateRxAlign()
        {            return new RxAlignB();
        }        public IDispensing CreateDispensing()
        {            return new DispensingB();
        }
    }

Couplingインターフェース

interface IRxAlign
    { 
        event LocationChange LocChange;        
int[] RoPulse { set; get; }        
int[] FiPulse { set; get; }        
int[] RoMaxStep { set; get; }        
double[] RoRESTarget { set; get; }        
double[] TxP { set; get; }        
double[] RESmin { set; get; }        
double[] RESmax { set; get; }

        Coordinate Location { set; get; }        
void LoadPara(string PN);        
void GoHome();        
void Start();        
void Stop();
    }

class RxAlignA : IRxAlign
    {        private ControlCard card;        
private QSFP28 product;        
private double RESmax, RESmin, RES;        
private double[] TxPower;        
public RxAlignA()
        {            
this.RESmax = 1.0;            
this.RESmin = 0.4;
        }        
public bool ConfigPara()
        {            
try
            {                
this.card = new ControlCard();                
this.product = new QSFP28();               
 return true;
            }            catch
            {                return false;
            }
        }        public void GoHome()
        {            //QSFP28 go home
        }        public void Start()
        {            //QSFP28 start
        }        public void Stop()
        {
            card = null;
            product = null;
        }
        ...
    }

class RxAlignB : IRxAlign
    {        private ControlCard card;        
 private CFP4 product;        
 private double RESmax, RESmin, RES;        
 private double[] TxPower;        
 public RxAlignB()
        {            this.RESmax = 1.0;            
 this.RESmin = 0.4;
        }        public bool ConfigPara()
        {            try
            {                this.card = new ControlCard();                
 this.product = new CFP4();                
 return true;
            }            catch
            {                return false;
            }
        }        public void GoHome()
        {            //CFP4 go home
        }        public void Start()
        {            //CFP4 start
        }        public void Stop()
        {
            card = null;
            product = null;
        }
        ...
    }

Glueインターフェース

interface IDispensing
    {
        //code
    }class DispensingA : IDispensing
    {
        //code
    }class DispensingB : IDispensing
    {
        //code
    }

メインスレッド呼び出し

flow = new FlowA();
align = flow.CreateRxAlign();
align.LoadPara(this.comboBoxPN.Text);

dispens = flow.CreateDispensing();
dispens.//code...

以上は0-Abstract Factoryの独習C#09の内容ですパターンの例 、その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。