デザインパターン - noriyuki-shimizu/myClothes GitHub Wiki
★デザインパターン★
adapter 一皮かぶせて再利用
template method 具体的な処理をサブクラスに任せる
factory methood インスタンス作成をサブクラスにまかせる
singleton たった1つのインスタンス
prototype コピーしてインスタンスを作る
builder 複雑なインスタンスを組み立てる
abstract factory 関連する部品を組み合わせて製品を作る
bridge 機能の改装と実装の改装を分ける
strategy アルゴリズムをごっそり切り替える
composite 容器と中身の同一視
decorator 飾り枠と中身の同一視
visitor 構造を渡り歩きながら仕事をする
chain of responsibility 責任のたらいまわし
facade シンプルな窓口
mediator 相手は相談役1人だけ
observer 状態の変化を通知する
memento 状態を保存する
state 状態をクラスとして表現する
flyweight 同じものを共有して無駄をなくす
proxy 必要になってから作る
command 命令をクラスにする
interpreter 文法規則をクラスで表現する
public abstract class Product<T> {
protected T ownerId;
public Product(T ownerId) {
this.ownerId = ownerId;
}
public Product() {}
public abstract void method1();
public abstract void method2();
}
public class ConcreteProduct extends Product<String> {
public ConcreteProduct(String ownerId) {
super(ownerId);
}
public ConcreteProduct() {}
public void method1() {
System.out.println("method1 !!");
}
public void method2() {
System.out.println("method2 !!");
}
}
public abstract class Creator<T> {
protected Map<String, T> pool;
public final T create(String ownerId) {
//createProductを使ってインスタンスを取得
return factoryMethod(ownerId);
}
protected abstract T factoryMethod(String ownerId);
protected abstract T factoryMethod();
}
public class ConcreteCreator extends Creator<Product<String>> {
public ConcreteCreator() {
this.pool = new HashMap<String, Product<String>>();
}
protected Product<String> factoryMethod(String ownerId) {
Product<String> product = this.pool.get(ownerId);
if(product == null) {
product = new ConcreteProduct(ownerId);
this.pool.put(ownerId, product);
}
return product;
}
protected Product<String> factoryMethod() {
return new ConcreteProduct();
}
}
public class Client {
public static void main(String[] args) {
Creator<Product<String>> creator = new ConcreteCreator(); // Creator は抽象クラスなので, Creator() コンストラクタが使えない.
Product<String> product = creator.factoryMethod("p_logic");
product.method1();
product.method2();
}
}