0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Factory Method Pattern

Last updated at Posted at 2020-11-08

#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.sam
package implement;

class sam{}
user(Main.class)
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 他の開発者がこのパターンを利用する、という意味合いを含みます
samFramework.classとfactoryFramework.classは 何もimportしていません また user(Main.class) は sam( )をimportできませんので new sam( )でsamインスタンスを取得できません

ではクラスを作っていきます

samFramework.class
package framework;

public abstract class samFramework{
  public abstract void show();
}
factoryFramework.class
package framework;

public abstract class factoryFramework{
  public abstract samFramework newInstance();
}
sam.class
package implement;
import framework.samFramework;

class sam extends samFramework {
  public void show(){System.out.println("sam");}
}
factory.class
package implement;
import framework.factoryFramework;
import framework.samFramework;

public class factory extends factoryFramework {
  public samFramework newInstance(){return new sam();}
}
user(Main.class)
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();
}}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?