Scala設計モード:作成モード


プラントメソッド
簡単に言えば、工場の方法( factory method)は、オブジェクトを作成するためのインタフェースを提供し、サブクラスによって特定のオブジェクトを作成する方法をカプセル化します.
工場アプローチを使用すると、次のようなメリットが得られます.
複雑なオブジェクト作成コードをメソッド呼び出しに単純化します.
異なるクラスのインスタンスを作成できます.
オブジェクトをキャッシュします.
共有リソースに一貫性のあるアクセスを提供します..
静的ファクトリ法(static factory method)を用いることを考えることができ,この方式は古典的なモードとはやや異なり,サブクラスを回避するが,この方法を再ロードする方法もない.
Javaでは、newを使用してクラスのコンストラクション関数を呼び出してクラスをインスタンス化します.このモードを実現するために,通常の方法,すなわちクラス内の静的方法を用いた.
public interface Animal {}
private class Dog implements Animal {}
private class Cat implements Animal {}

public class AnimalFactory {
    public static Animal createAnimal(String kind) {
        if ("cat".equals(kind)) return new Cat();
        if ("dog".equals(kind)) return new Dog();
        throw new IllegalArgumentException();
    }
}

AnimalFactory.createAnimal("dog");

直接コンストラクション関数を呼び出す以外に、scalaはコンストラクション関数呼び出しに似ているように見える特殊な構文構造を提供しますが、実際にはより便利なファクトリメソッドです.
trait Animal
private class Dog extends Animal
private class Cat extends Animal

object Animal {
  def apply(kind: String) = kind match {
    case "dog" => new Dog()
    case "cat" => new Cat()
  }
}

Animal("dog")

ファクトリメソッドは、オブジェクト(タイプと同じ名前の特殊な単一のオブジェクト)に伴って定義されます.次は、この方法の優劣です.
メリット:
ベースクラスの名前を再利用します.
標準、簡潔.
コンストラクション関数の呼び出しを比較します.
劣勢:
静的手法を用いた.
遅延初期化
遅延初期化(Lazy initialization)は、オブジェクトが最初にアクセスされたときに初期化される特別な遅延評価ポリシーです.これを使用すると、時間のかかる計算を遅らせる(または避ける)ことができます.
Javaでの比較的典型的な実装はnullを使用して初期化されていない状態を表すが、nullが有用な状態の化である場合、初期化のプロセスがすでに発生しているかどうかを個別のタグで説明する必要がある.
マルチスレッド環境でsynchronizedを使用する必要がある 不必要な競争を回避し、使用することもできます. double-checked locking より効率的な同期を保証し、コードをより複雑にします.
private volatile Component component;

public Component getComponent() {
    Component result = component;
    if (result == null) {
        synchronized(this) {
            result = component;
            if (result == null) {
                component = result = new Component();
            }
        }
    }
    return result;
}

scalaはクリーンな組み込み構文で怠け者値を定義する(lazy value)
lazy val x = {
  print("(computing x) ")
  42
}

print("x = ") 
println(x) 

// x = (computing x) 42

怠け者はscalaでnullを使用することができ、怠け者へのアクセスはスレッドセキュリティ(thread-safe)である.以下に、このモードの優劣を示します.
メリット:
コードが簡潔です.怠け者はnull.を使用できます
怠け者はスレッドが安全です.
劣勢:
初期化プロセスに対する制御不足単一の例
単一モード制限クラスは、1つのオブジェクトしか作成できず、一意のアクセスポイントが提供されます.単一のモデルはJavaの中で最も有名な設計モデルかもしれません.以下はJavaの実現方法です.
public class Cat implements Runnable {
    private static final Cat instance = new Cat();
 
    private Cat() {}
 
    public void run() {
        // do nothing
    }

    public static Cat getInstance() {
        return instance;
    }
}

Cat.getInstance().run()

Scalaは言語によって簡潔で直接的な実現を提供した.
object Cat extends Runnable {
  def run() {
    // do nothing
  }
}

Cat.run()

scalaでは、objectはクラスまたはインタフェースからメソッドを継承することができ、objectは直接またはインタフェースを通じてアクセスすることができ、objectは最初の使用時に初期化される.
メリット:
意味がはっきりしている.
文法が簡潔である.
必要に応じて初期化します.
スレッドは安全です.
劣勢:
初期化で制御するのは容易ではありません.
この文章は主にDesign Patterns in Scaleを翻訳しているが、縮小と変更がある.