#Factory Method Pattern
packageが異なるケースなど、newでインスタンスを生成できないケースでは、Factory Method Patternを利用して、インスタンスを取得する
factory抽象クラスはインスタンス化する骨組みを定義し
factory抽象クラスのサブクラスが実際のインスタンスを生成する
userはfactory抽象クラスを通じてインスタンスを受け取る
Design Pattarm MENU
このページは下記の構成となってます
コードを確認するだけなら2番目に飛んでください
・new でインスタンスを生成できないケース
・Factory Method Pattern の確認
##new でインスタンスを生成できないケース
以下のクラス構成で確認します
パッケージ名 | クラス | アクセス修飾子 | 説明 |
---|---|---|---|
Default | user(Main.class) | public | 動作を確認する |
implement | sam.class | Default | 特になし |
package implement;
class sam{}
import implement.*;
public static void main(String[] args){
sam s = new sam();
}
結果
sam cannot be resolved to a type
sam.classのアクセス修飾子はDefaultですから
所属パッケージに所属するクラスからしかアクセスできません
従ってuserから、sam.classは完全に独立し、触れることができません
例えば、このようなケースでFactory Method Patternを使います
##Factory Method Pattern の確認
以下の構成で確認します
パッケージ名 | アクセス修飾子 | クラス | import | 説明 |
---|---|---|---|---|
framework | public | abstract samFramework.class | なし | userが利用するオブジェクトの抽象クラス |
framework | public | abstract factoryFramwork.class | なし | インスタンス生成を定義する抽象クラス |
implement | Default | sam.class | import framework.samFramework | userはsam()のインスタンスを利用する |
implement | public | factory.class | import framework.samFramework import framework.factoryFramework |
sam.classのインスタンスを生成する |
Default | public | user(Main.class) | import framework.samFramework import framework.factoryFramework import implement.factory |
|
*user 他の開発者がこのパターンを利用する、という意味合いを含みます |
ではクラスを作っていきます
package framework;
public abstract class samFramework{
public abstract void show();
}
package framework;
public abstract class factoryFramework{
public abstract samFramework newInstance();
}
package implement;
import framework.samFramework;
class sam extends samFramework {
public void show(){System.out.println("sam");}
}
package implement;
import framework.factoryFramework;
import framework.samFramework;
public class factory extends factoryFramework {
public samFramework newInstance(){return new sam();}
}
import framework.factoryFramework;
import framework.samFramework;
import implement.factory;
class Main {
public static void main(String[] args){
factoryFramework factory = new factory();
samFramework sam = factory.newInstance();
sam.show();
}}