お時間をいただきありがとうございます!
これは、私を大いに混乱させた問題です!それは、Factory パターンのコンポーネント間の依存関係に関するものです。
オリジナルモデル
上の写真のように、ここに Window Factory Model があります。
1.Interface: IFatory IWindow,IButton,ITextBox (モデル定義);
2.実装: WindowsFactory,MacFatory (インターフェイスを実装するため);</p>
新しいモデル
今、古いモデルを変更しました。そのため、IWindow には「CloseButton」と「TitileBox」という名前の 2 つのプロパティがあります。問題が発生します。
1.これら2つのプロパティをいつ、どのように実装しますか?
2.これらの 2 つのプロパティは、コンテナー ウィンドウと同じスタイルを持つ必要があります。
これらの問題を解決するために、いくつかの試行錯誤を行いました。以下のコードを確認してください。
解決策 1
class MacWindow:IWindow
{
public IButton CloseButton {get;private set;}
public ITextBox TitleBox {get;private set;}
public MacWindow()
{
this.CreateCloseButton();
this.CreateTitleBox();
}
protected virtual void CreateCloseButton()
{
CloseButton = new MacButton();
}
protected virtual void CreateTitleBox()
{
TitleBox = new MacTextBox();
}
}
ご覧のとおり、このソリューションは良くありません。
1.クラス MacWindow は、特定の IButton/ITextBox 実装に依存する必要があります (ただし、それらは同じファクトリにあります)。
2.いつか、クラス MacWindow から派生した新しいクラスを取得した場合、それらの仮想メソッドをオーバーライドして、それらを同じスタイルに保つ必要があります。
解決策 2
class MacWindow:IWindow
{
public IFactory ActiveFactory{get;private set;}
public IButton CloseButton {get;private set;}
public ITextBox TitleBox {get;private set;}
public MacWindow(IFactory factoy)
{
this.ActiveFactory=factory;
this.CreateCloseButton();
this.CreateTitleBox();
}
private void CreateCloseButton()
{
CloseButton = ActiveFactory.MakeButton();
}
private void CreateTitleBox()
{
TitleBox = ActiveFactory.MakeTextBox();
}
}
これは見た目が良くなりましたが、今では完璧です。
1. MacOSXFactory という名前の MacFactory から派生した新しいファクトリを取得した場合、作業がはるかに簡単になりました。必要なことは、IFactory.MakeButton() および IFactory.MakeTextBox() メソッドをオーバーライドすることだけです;(er. .これらのメソッドは「パブリック仮想」として定義する必要があります)
2.特定の実装への依存関係はなくなりましたが、ウィンドウ クラスは IFactory への依存関係を注入する必要があります。工場の詳細を製品に知られてしまうのは気分が悪い。
というわけでパズルです!どちらのソリューションが優れていますか? この問題を解決する他の方法はありますか? (知りたい!本当にありがとう!) アドバイスをお願いします。
了承
「ありがとうございます!」と言わせてください。質問を読んでください!