design patterns java
このチュートリアルでは、Javaのデザインパターンについて説明します。シングルトン、ファクトリ、ビルダーのパターンを例と利点とともに研究します。
特定の問題を解決するときに、いくつかのベストプラクティスがすでに定義されていれば、より効率的に解決できます。これは確かに、これらのベストプラクティスに従い、より信頼性の高いソリューションを開発するのに役立ちます。
これら ベストプラクティス 開発に使用できる 実績のあるソリューション 問題を解決するために「 デザインパターン 」。経験豊富なOOPソフトウェア開発者は、デザインパターンを使用して特定のタスクを解決します。
学習内容:
Javaのデザインパターン
デザインパターンは1977年にクリストファーアレクサンダーによって最初に発明されました。しかしその後、4人の開発者、すなわちエーリヒガンマ、リチャードヘルム、ジョンブリシディーズ、ラルフジョンソンが「 4つのギャング-デザインパターン、再利用可能なオブジェクト指向ソフトウェアの要素 」1995年に。
それ以来、すべてのデザインパターンは「 4つのデザインパターンのギャング 」。
配列と関数c ++
デザインパターンは、一般的なオブジェクト指向の設計問題を解決するために使用され、特定のプログラミング言語に限定されないため、プログラミング言語に依存しません。つまり、基本的にはアイデアであり、実装ではありません。
したがって、デザインパターンを使用して、より効率的で、柔軟性があり、保守可能で、再利用可能なプログラムを開発できます。
デザインパターンの利点
以下に、アプリケーションでデザインパターンを使用する利点のいくつかを示します。
- デザインパターンは再利用可能であり、複数のプロジェクトで使用できます。
- デザインパターンを使用してシステムアーキテクチャを定義できます。
- デザインパターンは、アプリケーションデザインに透明性を提供します。
- デザインパターンはすでに十分にテストされ、証明されているため、心配することなく使用できます。
- デザインパターンにより、より優れたシステムを構築でき、システムアーキテクチャを明確にすることができます。
デザインパターンを使用する場合
では、いつデザインパターンを正確に使用する必要があるのでしょうか。
通常、SDLC(ソフトウェア開発ライフサイクル)の初期分析および要件フェーズでデザインパターンを使用します。 SDLCの分析および要件フェーズで使用すると、このフェーズにより多くの情報が提供されます。 Javaは内部的にデザインパターンをサポートしています。
Javaのデザインパターンは次のように分類されます。
このチュートリアルに関する限り、私たちは創造的なデザインパターンにのみ興味があります。
創造的なデザインパターンは、さらに次のように分類されます。
このチュートリアルでは、次のデザインパターンについて説明します。
- シングルトンデザインパターン
- ファクトリデザインパターン
- ビルダーデザインパターン
Javaのシングルトンデザインパターンから始めましょう。
推奨読書= >> Flaskベースのアプリのデザインパターン
Javaのシングルトンパターン
シングルトンパターンは、Javaの作成パターンの一種です。シングルトンパターンは、クラスのインスタンスが1つだけJava仮想マシンに存在するデザインパターンです。シングルトンクラス(シングルトンパターンの実装)は、クラスのインスタンスを取得するためのグローバルアクセスポイントを提供する必要があります。
言い換えると、シングルトンパターンはクラスのインスタンス化を制限します。シングルトンパターンは、アプリケーションのロガーの実装で使用されます。また、スレッドプールの実装またはキャッシュでも使用されます。
Javaクラス、 java.awt.Desktop そして java.lang.runtime シングルトンパターンも使用します。
利点
- シングルトンクラスのインスタンスが1つだけ使用されるため、メモリを節約します。
- また、同じシングルトンオブジェクトが何度も使用されるため、再利用性が保証されます。
それでは、シングルトンパターンの実装に移りましょう。
シングルトンパターンの実装
すでに述べたように、シングルトンデザインパターンは1つのインスタンスのみでクラスを制限し、このインスタンスにはグローバルアクセスポイントが与えられます。これは、同じオブジェクトを何度も参照するすべてのクラスでした。
次のUMLダイアグラムは、シングルトンパターンを説明しています。
上記のUMLダイアグラムが示すように、シングルトンクラスには単一のインスタンスが定義されており、getInstance()メソッドによってアクセスします。したがって、オブジェクトの作成を担当するシングルトンファクトリは、getInstanceメソッドを使用して、同じオブジェクト(クラスにある)を何度も返します。
では、プログラムにシングルトンパターンを実装するにはどうすればよいでしょうか。
シングルトンクラスを作成し、そのコンストラクターを「プライベート」として設定して、クラスをインスタンス化できないようにします。次に、クラス自体の中にこのシングルトンクラスのプライベートインスタンスを作成します。次に、シングルトンオブジェクトを外部に返す特別なパブリックメソッドgetInstance()があります。
上で説明したこのシングルトンクラスのこの実装は、以下のJavaプログラムに示されています。
class SingletonObject { //create an object of SingletonObject private static SingletonObject instance = new SingletonObject(); //private constructor so that we cannot instantiate the class private SingletonObject(){} //returns the only available object public static SingletonObject getInstance(){ return instance; } public void printMessage(){ System.out.println('Hello from Singleton object!!!'); } } public class Main { public static void main(String() args) { //illegal statement because constructor is private //Compile Time Error: The constructor SingletonObject() is not visible //SingletonObject object = new SingletonObject(); //call getInstance to retrieve the object available from the class SingletonObject object = SingletonObject.getInstance(); //show the message object.printMessage(); } }
出力:
ここで、mainメソッドをチェックする場合、new演算子を使用してシングルトンクラスのオブジェクトを作成しようとすると、コンパイラーがコンパイルエラーを返すことに注意してください(mainメソッドのコメント付きコードを参照)。 getInstance()メソッドを使用してシングルトンクラスのオブジェクトを取得し、それを通常どおりに使用してメソッドにアクセスできます。
Javaのファクトリパターン
ファクトリパターンは、Javaでは「ファクトリメソッドパターン」または「仮想コンストラクタ」とも呼ばれます。このパターンでは、メソッド宣言を使用してインターフェイスまたは抽象クラスを作成し、このインターフェイスを実装するか、クラスを継承する具象クラスまたはサブクラスが、クラスのインスタンスの作成を担当します。
利点
- ファクトリパターンは作成パターンの一種であり、Javaで最も一般的に使用されるパターンです。
- ファクトリパターンを使用することで、実際の作成ロジックが外の世界に公開されないようにします。
したがって、ファクトリパターンを実装するクラスに利率を計算するメソッドがある場合、具象クラスはこのクラスを実装し、利率を計算するメソッドも実装します。
次に、これらの具象クラスインスタンスにアクセスするファクトリクラスである別のクラスがあるため、金利を計算するロジックがどのように実装されているかがわかりません。メソッドを呼び出して出力を取得するだけです。
では、いつ正確にファクトリメソッドパターンを使用できるのでしょうか。
親クラスがインスタンスの作成をサブクラスに委任することを決定した場合、ファクトリパターンを選択できます(これは上記で説明されています)。クラスが作成するサブクラスを知らない場合にも、ファクトリメソッドを使用できます。
それでは、ファクトリメソッドパターンの実装を見てみましょう。
ファクトリパターンの実装
例として、一般的な形状インターフェースを実装しましょう。円、長方形など、このインターフェイスからさまざまな具象クラスを派生させることができます。次に、具象クラスオブジェクトにアクセスするshapeFactoryクラスを作成します。このパターンのUMLを以下に示します。
すでに説明したように、これはファクトリパターンのUML図です。次に、ファクトリパターンを示すJavaプログラムを実装します。
//Geometric_shape interface interface Geometric_shape { void draw_shape(); } //Geometric shape classes implementing Geometric_shape interface class Rectangle implements Geometric_shape { @Override public void draw_shape() { System.out.println('Rectangle class::draw_shape() method.'); } } class Square implements Geometric_shape { @Override public void draw_shape() { System.out.println('Square class::draw_shape() method.'); } } class Circle implements Geometric_shape { @Override public void draw_shape() { System.out.println('Circle class::draw_shape() method.'); } } //Factory class for Geometric_shape class ShapeFactory { //shapeObject method gets particular shapeType (circle, Square or Rectangle) public Geometric_shape shapeObject(String shapeType){ if(shapeType == null){ return null; } //retrieve Circle object if(shapeType.equalsIgnoreCase('Circle')){ return new Circle(); //retrieve Rectangle object } else if(shapeType.equalsIgnoreCase('Rectangle')){ return new Rectangle(); ////retrieve Square object } else if(shapeType.equalsIgnoreCase('Square')){ return new Square(); } return null; } } public class Main { public static void main(String() args) { //Create a ShapeFactory object to get different geometric shapes ShapeFactory shapeFactory = new ShapeFactory(); //circle Geometric_shape shape_Circle = shapeFactory.shapeObject('CIRCLE'); //draw method of Circle shape_Circle.draw_shape(); //Rectangle Geometric_shape shape_Rectangle = shapeFactory.shapeObject('RECTANGLE'); //draw method of Rectangle shape_Rectangle.draw_shape(); //Square Geometric_shape shape_Square = shapeFactory.shapeObject('SQUARE'); //draw method of square shape_Square.draw_shape(); } }
出力:
Javaのビルダーパターン
Builderパターンでは、段階的なアプローチを使用して、小さくて単純なオブジェクトを使用して複雑なオブジェクトを構築します。
したがって、1つのステップで作成できないオブジェクトに遭遇した場合は常に、ビルダーパターンを使用します。
利点
- Builderパターンを使用して、オブジェクトの構成と表現を分離できます。
- オブジェクトの内部表現を変更することもできます。
- ビルダーパターンを使用して、配信システム全体のような複雑なデザインを構築できます。
Builderパターンの実際的な例は、注文された食品を収集し、パッケージング、請求、注文を作成してから出荷するという複雑なステップを含む食品注文システムです。
このチュートリアルでは、Builderパターンを使用したタブレット注文システムの例を実装します。
ビルダーパターンの実装
Builderパターンの一般的なUML図を以下に示します。
上の図は、BuilderパターンのUML図を示しています。上の図に示すように、Builderパターンには4つのコンポーネントがあります。
- 製品: これは、構築される複雑なオブジェクトを表します。
- Builder抽象クラス: 複雑なオブジェクトを構築するために必要なすべての機能のプロトタイプを含む抽象クラス。
- ConcreteBuilderクラス: これは、Builderクラスを継承し、特定の複雑なオブジェクトを作成する具象クラスです。必要な数のConcreteBuilderクラスを持つことができます。
- ディレクタークラス: このクラスは、最終製品を生成するアルゴリズムを制御します。
次のプログラミング例は、タブレット注文構築システムを使用したBuilderパターンのデモンストレーションを示しています。
import java.util.ArrayList; import java.util.List; //Packing interface for tablets interface Packing { public String pack(); public int price(); } //Tablet class - abstract abstract class Tablet implements Packing{ public abstract String pack(); } //company - extends Tablet abstract class Company extends Tablet{ public abstract int price(); } //Lenovo tablet class Lenovo extends Company{ @Override public int price(){ return 541; } @Override public String pack(){ return 'Lenovo Yoga'; } } //Micromax tablet class MicroMax extends Company { @Override public int price(){ return 338; } @Override public String pack(){ return 'MicroMax'; } } //Tablet type class TabType { private List items=new ArrayList(); //add items public void addItem(Packing packs) { items.add(packs); } //retrieve cost public void getCost(){ for (Packing packs : items) { packs.price(); } } //show all items public void showItems(){ for (Packing packing : items){ System.out.print('Tablet name : '+packing.pack()); System.out.println(', Price(in U.S.Dollars) : '+packing.price()); } } } //builder class for tablets order class TabBuilder { public TabType buildLenovoTab(){ TabType lenovo =new TabType(); lenovo.addItem(new Lenovo()); return lenovo; } public TabType buildMicroMaxTab(){ TabType mmx=new TabType(); mmx.addItem(new MicroMax()); return mmx; } } public class Main{ public static void main(String args()){ //build the tablets order and display the order TabBuilder tabBuilder=new TabBuilder(); TabType tabtype1=tabBuilder.buildLenovoTab(); tabtype1.showItems(); TabType tabtype2=tabBuilder.buildMicroMaxTab(); tabtype2.showItems(); } }
出力:
上記の例では、2つのタブレットブランド(LenovoとMicromax)の完全なタブレット注文システムを構築しました。これらは、抽象クラス会社から継承するconcreteBuilderクラスです。次に、両方のタブレットクラスの注文を作成するTabBuilderクラスがあります。
よくある質問
Q#1)Javaのデザインパターンとは何ですか? Javaのデザインパターンの種類は何ですか?
pl / sql開発者インタビューの質問
回答: デザインパターンは、十分にテストされたソリューションを開発するために使用できるベストプラクティスです。
Javaには、次の3種類のデザインパターンがあります。
- 創造的なデザインパターン: ファクトリパターン、アブストラクトファクトリパターン、シングルトンパターン、ビルダーパターン、プロトタイプパターンは、作成デザインパターンの例です。これらは主にオブジェクトの作成に関係しています。
- 構造設計パターン: これらは主にクラス構造を作成するために使用されます。アダプター、ブリッジ、および複合パターンは、一般的な構造設計パターンです。
- 行動デザインパターン: これらは、実装を簡単に拡張するための柔軟性とともに、オブジェクト間のより良い相互作用を提供します。オブザーバーパターン、戦略パターンなどは、行動パターンのいくつかの例です。
Q#2)デザインパターンが使用されるのはなぜですか?
回答: デザインパターンは、複雑な問題を解決するために使用できる、実証済みのテスト済みソリューションモデルを提供します。デザインパターンにより、疎結合の凝集モジュールを構築できます。デザインパターンはまた、デザイナー間の相互作用をより効率的かつ効果的にします。
Q#3)パターンの例は何ですか?
回答: 自然のパターンの例は、自然界に見られる目に見える規則性です。対称性、樹木、波、泡、縞模様、ひび割れなどの自然なパターンは、自然なパターンのいくつかの例です。
Q#4)MVCはデザインパターンですか?
回答: はい、これは一種のデザインパターンであり、データモデル、プレゼンテーション、またはビューレイヤーとコントローラーで構成されるアプリケーションを構築できます。これをアーキテクチャパターンとしてさらに分類できます。
結論
これで、Javaのデザインパターンに関する説明は終わりです。 Javaは3種類のデザインパターンをサポートしていますが、創造的、構造的、行動的パターン、私たちは創造的デザインパターンにもっと興味を持っています。
このチュートリアルの範囲に従って、作成デザインパターンの3つの例、つまり、シングルトンパターン、ファクトリパターン、およびビルダーパターンについて説明しました。
シングルトンパターンは最も単純なデザインパターンであり、ファクトリメソッドは広く使用されている一般的なデザインパターンであると考えられています。ビルダーパターンは、複雑なオブジェクトを構築するために使用され、主に複雑なアプリケーションの開発に使用されます。
=> ここで完璧なJavaトレーニングガイドをチェックしてください。