シンプルなファクトリパターン
コンセプト
スキーマを作成するための簡単な工場出荷時のパターンは、静的ファクトリメソッド(静的ファクトリメソッド)として知られ、所属しています。単純なファクトリパターンは、製品クラスのインスタンスを作成するファクトリオブジェクトによって決定されます。シンプルモードでは、工場は、異なるパラメータに応じて異なるクラスのインスタンスを返すことができます。シンプルなファクトリパターンインスタンスを作成するための責任を他のクラスに特別なクラスを定義するには、インスタンスが正常に作成され、共通の親クラスを持っています。シンプルなファクトリパターンは、工場モデルファミリは、最もシンプルで実用的なモデルは、異なる植物の実現の特別なモードとして理解することができますされています
これは、単純なファクトリパターンがGOFのデザインパターンのいずれかに属していないことは注目に値します。しかし、彼はAbstract Factoryパターン、Factory Methodパターンの基礎を言って、アプリケーションの広い範囲がありました
モード構造
構図
コンクリート工場、抽象と具象の製品製品:上の図からわかるように、簡単な工場出荷時のパターンは3つの部分から構成します:
- ファクトリクラス(クリエイター):これは、このモードの中核である、それは特定のビジネスロジックやアービトレーション・ロジックが含まれています。Javaでは、それは多くの場合、特定のクラスによって実装されます
- 抽象物(AbstractProduct):これは、特定の製品は、親クラスを継承するか、インタフェースを実装する一般的です。Javaでは、インターフェースは抽象クラスによって実装されますか
- 特定の製品(ConcreteProduct):オブジェクトファクトリクラスは、このロールのインスタンスを作成しています。Javaで特定のクラスによって実現
ケーススタディ
要件:そこりんごとバナナクラスクラスは、彼らはgetメソッドを持って、彼らはメイン関数でインスタンス化されており、getメソッドを呼び出します
方法1:最も基本的なインスタンス化
Apple.java:
public class Apple {
/**
* 采集苹果
*/
public void get(){
System.out.println("采集苹果");
}
}
Banana.java:
public class Banana {
/**
* 采集香蕉
*/
public void get(){
System.out.println("采集香蕉");
}
}
MainClass.java:
public class Mainclass{
public static void main(String[] args){
/**
* 最基本的实例化方式
*/
//实例化一个Apple
Apple apple = new Apple();
//实例化一个Banana
Banana banana = new Banana();
apple.get();
banana.get();
}
}
第二の方法:両方のgetメソッドは、我々は、多型の方法で、そのクラスのインターフェイスを実装することができます
Fruit.java:
public interface Fruit {
public void get();
}
Apple.java:
public class Apple implements Fruit{
@Override
//重写get方法
public void get(){
System.out.println("采集苹果");
}
}
Banana.java:
public class Banana implements Fruit{
@Override
//重写get方法
public void get(){
System.out.println("采集香蕉");
}
}
MainClass.java:
public class Mainclass{
public static void main(String[] args){
/**
* 多态的实例化方式
*/
Fruit apple = FruitFactory.getApple();
Fruit banana = FruitFactory.getBanana();
apple.get();
banana.get();
}
}
三つの方法:新しい工場とメインロジックオブジェクトを実装するクラスを作成します
FruitFactory:
public class FruitFactory {
/**
* 获得Apple类的实例
*/
public static Fruit getApple(){
return new Apple();
}
/**
* 获得Banana类的实例
*/
public static Fruit getBanana(){
return new Banana();
}
}
Fruit.java:変わらず
public interface Fruit {
public void get();
}
Apple.java:変わらず
public class Apple implements Fruit{
@Override
//重写get方法
public void get(){
System.out.println("采集苹果");
}
}
Banana.java:変わらず
public class Banana implements Fruit{
@Override
//重写get方法
public void get(){
System.out.println("采集香蕉");
}
}
MainClass.java:変わらず
public class Mainclass{
public static void main(String[] args){
/**
* 通过工厂类的静态方法实例化
*/
Fruit apple = FruitFactory.getApple();
Fruit banana = FruitFactory.getBanana();
apple.get();
banana.get();
}
}
4つの方法:ファクトリクラスの最適化は、送信基準の一例として、同一のメソッドを呼び出します
FruitFactory:
public class FruitFactory {
public static Fruit getFruit(String type) throws IllegalAccessException, ClassNotFoundException, InstantiationException {
/**
* 对参数的判断并返回实例
*/
if (type.equalsIgnoreCase("apple")){
return Apple.class.newInstance();
} else if (type.equalsIgnoreCase("banana")){
return Banana.class.newInstance();
} else {
System.out.println("找不到相应的实例化类");
return null;
}
}
}
Fruit.java:変わらず
public interface Fruit {
public void get();
}
Apple.java:変わらず
public class Apple implements Fruit{
@Override
public void get(){
System.out.println("采集苹果");
}
}
Banana.java:変わらず
public class Banana implements Fruit{
@Override
public void get(){
System.out.println("采集香蕉");
}
}
MainClass.java:
public class Mainclass{
public static void main(String[] args) throws IllegalAccessException, ClassNotFoundException, InstantiationException {
Fruit apple = FruitFactory.getFruit("apple");
Fruit banana = FruitFactory.getFruit("banana");
apple.get();
banana.get();
}
}
次の5つの方法:クラス名で反射したファクトリクラスIIインスタンス化プロセスをさらに最適化を最適化します
FruitFactory:
public class FruitFactory {
public static Fruit getFruit(String type) throws IllegalAccessException, ClassNotFoundException, InstantiationException {
Class fruit = Class.forName(type);
return (Fruit)fruit.newInstance();
}
}
Fruit.java:変わらず
public interface Fruit {
public void get();
}
Apple.java:変わらず
public class Apple implements Fruit{
@Override
public void get(){
System.out.println("采集苹果");
}
}
Banana.java:変わらず
public class Banana implements Fruit{
@Override
public void get(){
System.out.println("采集香蕉");
}
}
MainClass.java:
public class Mainclass{
public static void main(String[] args) throws IllegalAccessException, ClassNotFoundException, InstantiationException {
Fruit apple = FruitFactory.getFruit("Apple");
Fruit banana = FruitFactory.getFruit("Banana");
apple.get();
banana.get();
}
}
利点
- ファクトリクラスは、クライアントが製品のオブジェクトを直接、唯一の「消費者」製品の作成に責任を免除することができるどのような時に作成された製品クラスのどのインスタンスを決定することができ、必要な論理判断を含んでいる;責任の実践を通じて達成シンプルなファクトリパターンをオブジェクトを作成するための特殊なファクトリクラスを提供分割、
- クライアントは、対応するパラメータをすることができ、特定の製品クラスを知っている必要がありますのみ作成したクラス名、特定の製品カテゴリを知っている必要はありませんが、いくつかの複雑なクラス名のために、簡単な工場のパターンは、ユーザメモリの量を減らすことができます
- 設定ファイルを導入することで、あなたは変更することができますし、任意のクライアント側のコードを変更せずに、新たな特定の製品カテゴリを追加し、ある程度システムの柔軟性を向上させます
- 新製品を導入する必要がクライアントコードを変更する必要はありません場合は、単に適切な製品カテゴリを追加して、単純なファクトリパターンの観点から製品がと一致しているように、それにファクトリクラスを変更し、「オープン - クローズ」の原則
短所
- ファクトリクラスは、すべての製品の作成ロジックを一元化しているので、私たちの工場のクラスは、一般的に彼ができるすべては良いことのように見える完全な製品を作成するため、「すべてのクラス」や「神クラス」と呼ばれるが、問題があると思いれますA。たとえば、国全体はもちろんのヒト幹ナショナリズムが問題ではないであろうすべてのものを、持っています!一度動作しない、システム全体が影響を受けなければなりません
- システムでファクトリクラスの数を増加させる単純なモデルを使用して、複雑さと特定の手順でシステムを理解することの難しさを増します
- 、新製品は、製品の多くの種類がある場合には、植物を変更するロジックを追加する必要があります植物のロジックが複雑すぎる可能性がありたら、困難なシステム拡張には、システムの拡張やメンテナンスを助長されていません。だから、植物の観点から、簡単な工場出荷時のパターンはと一致していないです - 原則「を開いて閉じて」
- 継承に基づいて階層を形成することができない工場の役割をもたらす静的ファクトリメソッドを使用するための単純なファクトリパターン、
該当シーン
- オブジェクトファクトリクラスは、比較的小さな作成するための責任がある:以下により作成されたオブジェクトに、ファクトリメソッドがあまりにも複雑なビジネスロジックを引き起こすことはありません
- クライアントは、オブジェクトを作成する方法を、ファクトリクラスを渡されたパラメータは気にしない知っている:クライアントは、作成の詳細についてどちらも注意が必要で、でも、クラスの名前は唯一、対応するパラメータの種類を知っておく必要があることを覚えておく必要はありません。