序文
単純なファクトリパターンは、23のGoFデザインパターンの1つではありませんが、一般に、デザインパターンを学習するための開始点として使用されます。シンプルファクトリパターンでは、さまざまなパラメータに従ってさまざまなクラスのインスタンスを返すことができます。シンプルファクトリパターンは、他のクラスのインスタンスの作成を担当するクラスを具体的に定義します。このクラスはファクトリクラスと呼ばれます。作成されたインスタンスには通常、共通の親クラス。
1.シンプルなファクトリーモデル
静的ファクトリメソッドパターン(静的ファクトリメソッドパターン)とも呼ばれるシンプルファクトリパターン(シンプルファクトリパターン)は、クラス作成パターンに属します。
定義:クラスを定義し、さまざまなパラメータに従ってさまざまなクラスインスタンスを返します。これらのクラスには、パブリック親クラスといくつかのパブリックメソッドがあります。単純なファクトリパターンはGoFデザインパターンに属していません。最も単純なファクトリパターンです。
使用頻度:4つ星の
単純なファクトリモデル構造図:
利点:
1。ファクトリクラスには、どの製品のインスタンスをいつ作成するかを決定できる必要な論理的判断が含まれています。クライアントは、製品オブジェクトを直接作成する責任を免除することができ、対応する製品を作成するのは非常に便利です。工場と製品の責任は明確に区別されます。
2.クライアントは、作成された特定の製品のクラス名を知る必要はなく、パラメーターのみを知る必要があります。
3.クライアントコードを変更せずに、新しい特定の製品カテゴリを置き換えて追加するための構成ファイルを導入することもできます。
短所:
1。シンプルなファクトリモデルは単一のファクトリタイプであり、すべての製品の作成を担当します。責任が重すぎます。異常になると、システム全体が影響を受けます。また、ファクトリコードは非常に肥大化し、高集約の原則に違反します。
2.単純なファクトリモデルを使用すると、システム内のクラスの数が増え(新しいファクトリクラスが導入され)、システムが複雑になり、理解
が難しくなります。3。システムを拡張するのが困難です。新製品が追加されると、ファクトリロジックを変更する必要があります。長い間、ロジックが複雑すぎる可能性があります
。4。単純なファクトリモデルは静的ファクトリメソッドを使用するため、ファクトリロールが継承に基づく階層構造を形成できません。
アプリケーションシナリオ:
比較的少数の製品タイプについては、単純なファクトリモデルの使用を検討してください。単純なファクトリパターンを使用するクライアントは、ファクトリクラスのパラメータを渡すだけでよく、オブジェクトの作成方法のロジックを気にする必要がなく、必要な製品を簡単に作成できます。
2.単純なファクトリパターン例のグラフィックファクトリ
1.説明例
単純なファクトリパターンを使用して、Circle、Rectangle、Triangleオブジェクトなどのさまざまな幾何学的形状(Shape)を作成できる描画ツールクラスを設計します。各幾何学的図形には描画と消去があります。消去の2つの方法では、描画時にUnsupportedShapeExceptionをスローする必要があります。サポートされていない幾何学図形、クラス図を描画し、プログラムで実装します。
2.インスタンスクラス図
3.サンプルコード
この例では、Shapeは抽象製品として機能し、そのサブクラスCircle、Rectangle、およびTriangleは具象製品として機能し、ShapeFactoryはファクトリクラスです。
//形状接口:抽象产品
interface Shape
{
public void draw();
public void erase();
}
//圆形类:具体产品
class Circle implements Shape
{
public void draw()
{
System.out.println("绘制圆形");
}
public void earse()
{
System.out.println("删除圆形");
}
}
//矩形类:具体产品
class Rectangle implements Shape
{
public void draw()
{
System.out.println("绘制矩形");
}
public void earse()
{
System.out.println("删除矩形");
}
}
//三角形类:具体产品
class Triangle implements Shape
{
public void draw()
{
System.out.println("绘制三角形");
}
public void earse()
{
System.out.println("删除三角形");
}
}
//形状工厂类:工厂
class ShapeFactory
{
//静态工厂方法
public static Shape createShape(String type)throws UnsupportedShapeException
{
if(type.equalsIgnoreCase("c")
{
return new Circle();
}
else if(type.equalsIgnoreCase("r")
{
return new Rectangle();
}
else if(type.equalsIgnoreCase("t")
{
return new Triangle();
}
else
{
throw new UnsupportedShapeException("不支持该形状!");
}
}
}
//自定义异常类
class UnsupportedShapeException extends Exception
{
public UnsupportedShapeException(String message)
{
super(message);
}
}
クライアントテストコード:
class Client
{
public static vodi main(String[] args)
{
try
{
Shape shape;
shape = ShapeFactory.createShape("r");
shape.draw();
shape.erase();
}
catch(UnsupportedShapeException e)
{
System.out.println(e.getMessage());
}
}
}
操作の結果は次のとおりです。
绘制矩形
删除矩形
参照
[1]シンプルファクトリーモード
[2]デザインモードトレーニングコース(第2版)清華大学出版、劉偉編集