私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
ファクトリパターンはオブジェクト指向プログラミングでよく使われるデザインパターンに属します。創作パターン種の。ファクトリ パターンは主にオブジェクトを作成するために使用されますが、コード内で直接使用する場合とは異なります。new
キーワードの作成は、共通のインターフェイスを通じてオブジェクトを作成するため、オブジェクト作成プロセスがクライアント コードの使用から分離されるという点で異なります。以下は、ファクトリー パターンの詳細な紹介です。
ファクトリ パターンは主に、単純なファクトリ パターン(静的ファクトリ パターン)、ファクトリ メソッド パターン、抽象ファクトリ パターンの 3 種類に分類されます。
単純なファクトリ パターン クラス図
ファクトリメソッドパターン
抽象的な工場パターン
ファクトリ パターンは、データベース接続、UI コントロール、ファイル処理、ロギング、ネットワーク通信、メッセージ キュー、データ構造、暗号化と復号化、メッセージ プッシュ、タスク スケジューリングなど、実際の開発で幅広い用途に使用できます。これらのシナリオでは、ファクトリ パターンを使用すると、オブジェクトの作成プロセスを使用プロセスから分離でき、システムの柔軟性と拡張性が向上します。
単純なファクトリ パターンでは、渡されたパラメータに基づいてさまざまな型のインスタンスを返すことができるファクトリ クラスを定義します。
以下は、Java で書かれた単純なファクトリ パターンの例です。円、長方形、正方形のインスタンスを生成できるシェイプ ファクトリを作成します。まず、形状インターフェイス (Shape) と、このインターフェイスを実装するいくつかの具象クラス (Circle、Rectangle、Square) を定義します。
- // 形状接口
- interface Shape {
- void draw();
- }
-
- // 圆形类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Circle::draw() method.");
- }
- }
-
- // 矩形类
- class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Rectangle::draw() method.");
- }
- }
-
- // 正方形类
- class Square implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Square::draw() method.");
- }
- }
次に、静的メソッドを使用してシェイプ オブジェクトを生成するファクトリ クラス (ShapeFactory) を定義します。
- // 形状工厂类
- class ShapeFactory {
-
- // 使用 getShape 方法获取形状类型的对象
- public static Shape getShape(String shapeType){
- if(shapeType == null){
- return null;
- }
- if(shapeType.equalsIgnoreCase("CIRCLE")){
- return new Circle();
- } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
- return new Rectangle();
- } else if(shapeType.equalsIgnoreCase("SQUARE")){
- return new Square();
- }
-
- return null;
- }
- }
最後に、ファクトリ クラスを使用してシェイプ オブジェクトを取得し、そのオブジェクトを呼び出すことができます。draw
方法。
- public class FactoryPatternDemo {
-
- public static void main(String[] args) {
- // 获取 Circle 的对象,并调用它的 draw 方法
- Shape shape1 = ShapeFactory.getShape("CIRCLE");
- shape1.draw();
-
- // 获取 Rectangle 的对象,并调用它的 draw 方法
- Shape shape2 = ShapeFactory.getShape("RECTANGLE");
- shape2.draw();
-
- // 获取 Square 的对象,并调用它的 draw 方法
- Shape shape3 = ShapeFactory.getShape("SQUARE");
- shape3.draw();
- }
- }
この例では、ShapeFactory
クラスは作成を担当しますShape
インターフェースのインスタンス。クライアント コードは、型情報 (文字列など) を渡すことでこれを行います。ShapeFactory
クラスの静的メソッドgetShape
目的の形状のインスタンスを取得します。このようにして、クライアントは特定のクラスの実装から切り離され、開始および終了の原則に準拠します。つまり、クライアント コードを変更せずに新しいシェイプ クラスを拡張できます。ただし、単純なファクトリ パターンの大きな欠点は、システムを新しい製品ファミリ (形状に加えて色など) で拡張する必要がある場合、ファクトリ クラスを変更する必要があり、オープン パッケージの一部に違反することです。 -閉鎖原則。この場合、Factory Method パターンまたは Abstract Factory パターンの使用を検討してください。
例としてまだ形を残していますが、エンジニアリング手法を使用してそれを作成します。
まず形状インターフェイス (Product) を定義し、3 つの実装クラスを作成します。
- // 形状接口
- interface Shape {
- void draw();
- }
-
- // 圆形类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Circle::draw() method.");
- }
- }
-
- // 矩形类
- class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Rectangle::draw() method.");
- }
- }
-
- // 正方形类
- class Square implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Square::draw() method.");
- }
- }
次に、作成者インターフェイス (Creator) と具体的な作成者 (Concrete Creator) を定義します。
- // 创建者接口
- interface ShapeFactory {
- Shape getShape(String shapeType);
- }
-
- // 具体创建者类
- class RectangleFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("RECTANGLE")) {
- return new Rectangle();
- }
- return null;
- }
- }
-
- class CircleFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("CIRCLE")) {
- return new Circle();
- }
- return null;
- }
- }
-
- class SquareFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("SQUARE")) {
- return new Square();
- }
- return null;
- }
- }
最後に、具象クリエーター クラスを使用してシェイプ オブジェクトを取得し、そのオブジェクトを呼び出します。draw
方法:
- public class FactoryMethodPatternDemo {
-
- public static void main(String[] args) {
- ShapeFactory shapeFactory = new CircleFactory();
-
- // 获取 Circle 的对象,并调用它的 draw 方法
- Shape shape1 = shapeFactory.getShape("CIRCLE");
- shape1.draw();
-
- // 使用 RectangleFactory 来获取 Rectangle 的对象
- shapeFactory = new RectangleFactory();
- Shape shape2 = shapeFactory.getShape("RECTANGLE");
- shape2.draw();
-
- // 使用 SquareFactory 来获取 Square 的对象
- shapeFactory = new SquareFactory();
- Shape shape3 = shapeFactory.getShape("SQUARE");
- shape3.draw();
- }
- }
この例では、各形状クラスに対応するファクトリ クラスを作成します。 (ただし、実際のアプリケーションでは、通常、製品クラスごとに個別のファクトリ クラスを作成することを避けるために、構成ファイルまたはリフレクションを介して、より一般的なファクトリ クラス構造が存在します)。これは、Factory Method パターンの基本原則を示すのに役立ちます。つまり、どのクラスをインスタンス化するかをファクトリのサブクラスに決定させます。 。ただし、この例の単純なケースでは、Simple Factory パターンを使用するか、コードの重複を減らすために他の設計パターンを検討する方がよいかもしれません。
この例では、携帯電話を例として、携帯電話に関連する製品 (画面、バッテリー、オペレーティング システムなど) を抽象化し、これらのインターフェイスを実装するための特定の製品クラスを作成します。次に、これらの製品を生成するための抽象ファクトリ インターフェイスと具体的なファクトリ クラスを定義できます。以下は、Abstract Factory パターンを使用して、携帯電話のさまざまなメーカーやモデルのコンポーネント (画面とバッテリー) を作成する方法を示す簡略化された例です。
まず、製品インターフェイスと特定の製品を定義します。
- // 屏幕接口
- interface Screen {
- void display();
- }
-
-
- // 高端屏幕的实现
- class HighEndScreen implements Screen {
- @Override
- public void display() {
- System.out.println("显示高清屏幕");
- }
- }
-
- // 低端屏幕的实现
- class LowEndScreen implements Screen {
- @Override
- public void display() {
- System.out.println("显示普通屏幕");
- }
- }
-
-
- // 电池接口
- interface Battery {
- void charge();
- }
-
-
- // 高效电池的实现
- class HighEfficiencyBattery implements Battery {
- @Override
- public void charge() {
- System.out.println("快速充电");
- }
- }
-
- // 标准电池的实现
- class StandardBattery implements Battery {
- @Override
- public void charge() {
- System.out.println("标准充电");
- }
- }
次に、抽象ファクトリ インターフェイスと具象ファクトリ クラスを定義します。
- // 手机组件工厂接口
- interface PhoneFactory {
- Screen createScreen();
- Battery createBattery();
- }
-
- // 高端手机工厂
- class HighEndPhoneFactory implements PhoneFactory {
- @Override
- public Screen createScreen() {
- return new HighEndScreen();
- }
-
- @Override
- public Battery createBattery() {
- return new HighEfficiencyBattery();
- }
- }
-
- // 低端手机工厂
- class LowEndPhoneFactory implements PhoneFactory {
- @Override
- public Screen createScreen() {
- return new LowEndScreen();
- }
-
- @Override
- public Battery createBattery() {
- return new StandardBattery();
- }
- }
最後に、抽象ファクトリを使用して具体的な製品オブジェクトを作成するクライアント コード:
- public class PhoneFactoryPatternDemo {
- public static void main(String[] args) {
- // 使用高端手机工厂
- PhoneFactory highEndFactory = new HighEndPhoneFactory();
- Screen highEndScreen = highEndFactory.createScreen();
- Battery highEndBattery = highEndFactory.createBattery();
-
- highEndScreen.display();
- highEndBattery.charge();
-
- // 使用低端手机工厂
- PhoneFactory lowEndFactory = new LowEndPhoneFactory();
- Screen lowEndScreen = lowEndFactory.createScreen();
- Battery lowEndBattery = lowEndFactory.createBattery();
-
- lowEndScreen.display();
- lowEndBattery.charge();
- }
- }
この例では、それぞれが特定のタイプの画面とバッテリーを生産できる 2 つの携帯電話工場 (ハイエンドとローエンド) を定義します。クライアント コードは、抽象ファクトリ インターフェイスを通じて特定のファクトリ クラスと対話し、それによって特定の製品クラスからの分離を実現します。 。このようにして、将来新しい電話タイプ(ミッドレンジ電話など)を追加する必要がある場合、既存のクライアント コードを変更せずに、新しい製品クラスと対応するファクトリ クラスを追加するだけで済みます。
ファクトリーパターンは非常に便利なデザインパターンですが、オブジェクトの作成プロセスをカプセル化し、結合を削減し、プログラムの拡張性やメンテナンスの容易性などを向上させます。 、ソフトウェア開発で広く使用されています。ただし、いくつかの点もあります工場の責任が重くなる、システム拡張が難しいなどのデメリットがあります。 。したがって、実際のアプリケーションでは、特定のシナリオとニーズに基づいてトレードオフと選択を行う必要があります。
ファクトリ パターン (単純なファクトリ、ファクトリ メソッド、抽象ファクトリ) が役立つ場合は、忘れずに「いいね」を押して収集してください。