忘備録
このページの内容は、予告なく削除する可能性があります。そのため、当ページへのリンク設定やお気に入り登録はご遠慮ください。
[ホーム]に戻る
[記事の先頭]
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
[記事の先頭]
[ホーム]に戻る
