1.単純工場モデルの問題点
前回のシンプルファクトリーパターンに関する記事では、シンプルファクトリーパターンはオープン&クローズの原則という設計原則に反しており、仕様に準拠していないと述べましたので、厳密に言えば、シンプルファクトリーパターンは実はデザインパターンの範疇には属しません。実際の開発現場では、製造と実装を切り離すために、ファクトリーを通して異なるインスタンスオブジェクトを生成したり取得したりする必要があることがよくあります。では、シンプルファクトリーパターンのスキームを設計原則に沿うように調整することは可能なのでしょうか?
最初に考えて、単純なファクトリパターンは、オープンとクローズの原則に違反している、新しい製品を追加するには、ファクトリを変更するには、新しい実装ロジックを追加する必要があります。その後、ファクトリのインスタンス化場所を調整する場合は、新しい製品は、ファクトリのロジックを変更するために行く必要がないように、オープンとクローズの原則に沿ったものではありません。シンプルなファクトリパターンのプロセスに従い、その後、インターフェイスを介して工場、レイヤーのカプセル化の工場?
2.単純な工場モデルのプログラムを開閉の原則に適合するように調整。
- 依存関係を分離するために、どのようにインターフェイスを使用するか、まず第一に、靴工場を表すインターフェイス
public interface Shoes {
}
public class Nike implements Shoes{
}
public class Adidas implements Shoes {
}
//すべての靴工場は私を受け継ぐだろう
public interface IShoesFactory {
Shoes createShoes();
}
- 工場があれば、アディダスとナイキを生産するためにそれぞれ2つの実現工場が必要です。
public class AdidasFactory implements IShoesFactory {
@Override
public Shoes createShoes() {
return new Adidas();
}
}
public class NikeFactory implements IShoesFactory {
@Override
public Shoes createShoes() {
return new Nike();
}
}
- 靴の鋳造所では、製品は鋳造所を通じて入手できます。
public class ShoesStore {
//靴はここにある
List<Shoes> myShoes = new ArrayList();
//私は白米の魚と無敵を持っている
public void myShoes() throws UnknowShoeType {
IShoesFactory adsft = new AdidasFactory();
Shoes ad= adsft.createShoes();
//私は白米の魚のラのペアを持っている
myShoes.add(ad);
IShoesFactory nikeft = new NikeFactory();
Shoes nike = nikeft.createShoes();
//私は無敵のラのペアを持っている
myShoes.add(nike);
}
}
このプロセスは非常に簡単です、つまり、靴クラスはまだ同じで、Shoesインターフェイスを介して、分離を達成するために、その後、工場のインスタンス化側が閉鎖の原則に違反しているため、その後、靴工場インターフェイスを定義します:IShoesFactory、工場とインスタンスプロセス間の分離を達成するために。こうすることで、新しいLiNingの靴製品を追加したい場合、ファクトリーを変更する必要はなく、追加すればよいのです:
public class LiNing implements Shoes {
}
public class ShoesStore {
//靴はここにある
List<Shoes> myShoes = new ArrayList();
//私は白米の魚と無敵を持っている
public void myShoes() throws UnknowShoeType {
IShoesFactory adsft = new AdidasFactory();
Shoes ad= adsft.createShoes();
//私は白米の魚のラのペアを持っている
myShoes.add(ad);
IShoesFactory nikeft = new NikeFactory();
Shoes nike = nikeft.createShoes();
//私は無敵のラのペアを持っている
myShoes.add(nike);
//コードを追加===============================
IShoesFactory lnft = new LiNingFactory();
Shoes lining = lnft.createShoes();
//私は李寧拉のペアを持っている
myShoes.add(lining);
//コードを追加===============================
}
}
まとめ
この時点で、拡張に対して開発し、修正に対して閉じることができるようにするには、インターフェイスを通して行う必要があることは明らかです。インターフェイス指向のプログラミングをしなければならない、つまり、依存関係と実装を分離し、オープンとクローズの原則の要件をオープンにしなければならない、ということをよく耳にするのはそのためです。
小さな出来事を読んで
この内容が少しでも役に立ったり、刺激になったりしたなら、親指の小指を動かしてみてください: