Title Image

Modified : 2025/11/03

忘備録

このページの内容は、予告なく削除する可能性があります。そのため、当ページへのリンク設定やお気に入り登録はご遠慮ください。
[ホーム]に戻る

[記事の先頭]

Gofのデザインパターン

Factory Method (Product - Creater)

@startuml 2. Factory Method
interface Product
class ConcreteProductA implements Product
class ConcreteProductB implements Product

abstract class Creator {
  +factoryMethod() : Product
}

class ConcreteCreatorA extends Creator {
  +factoryMethod() : Product
}
class ConcreteCreatorB extends Creator {
  +factoryMethod() : Product
}
@enduml
#include <iostream>
#include <memory>

// Product インターフェース
class Product {
public:
    virtual void use() const = 0;
    virtual ~Product() = default;
};

// ConcreteProductA
class ConcreteProductA : public Product {
public:
    void use() const override {
        std::cout << "Using ConcreteProductA\n";
    }
};

// ConcreteProductB
class ConcreteProductB : public Product {
public:
    void use() const override {
        std::cout << "Using ConcreteProductB\n";
    }
};

// Creator 抽象クラス
class Creator {
public:
    virtual std::unique_ptr<Product> factoryMethod() const = 0;

    void someOperation() const {
        auto product = factoryMethod();
        product->use();  // Product を使う処理
    }

    virtual ~Creator() = default;
};

// ConcreteCreatorA
class ConcreteCreatorA : public Creator {
public:
    std::unique_ptr<Product> factoryMethod() const override {
        return std::make_unique<ConcreteProductA>();
    }
};

// ConcreteCreatorB
class ConcreteCreatorB : public Creator {
public:
    std::unique_ptr<Product> factoryMethod() const override {
        return std::make_unique<ConcreteProductB>();
    }
};

// クライアントコード
int main() {
    std::unique_ptr<Creator> creatorA = std::make_unique<ConcreteCreatorA>();
    std::unique_ptr<Creator> creatorB = std::make_unique<ConcreteCreatorB>();

    creatorA->someOperation();  // ConcreteProductA を使用
    creatorB->someOperation();  // ConcreteProductB を使用

    return 0;
}

Factory Method (IProduct - ProductFactory)

@startuml 2. Factory Method - design03
interface IProduct {
  +GetData() : string
}
class ProductFake implements IProduct {
  +GetData() : string
}
class ProductSqlServer implements IProduct {
  +GetData() : string
}

abstract class ProductService {
  -FactoryMethod(kind : int) : IProduct
  +factorCreate() : IProduct
  +Exec(product : IProduct) : any
}

class ProductServiceFactory extends ProductService {
  -FactoryMethod(kind : int) : IProduct
}
@enduml

@startuml FactoryMethod
interface IProduct {
    + Read() : string
    + Write(text : string)
    + Xxx() : Any
}
class CanonProduct implements IProduct {
    + Read() : string
    + Write(text : string)
    + Xxx() : Any
}
class NikonProduct implements IProduct {
    + Read() : string
    + Write(text : string)
    + Xxx() : Any
}

abstract class ProductFactory {
    + FactoryMethod(modelName : string) : IProduct
}

class CanonProductFactory extends ProductFactory {
  + FactoryMethod(modelName : string) : IProduct
}

class NikonProductFactory extends ProductFactory {
  + FactoryMethod(modelName : string) : IProduct
}
@enduml
[記事の先頭]
[ホーム]に戻る