設計模式——8.工廠方法
阿新 • • 發佈:2018-11-19
工廠方法(Factory Method)
Factory Method模式簡介:
定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。
Factory Method模式結構:
C++程式碼
Product抽象類:
//file: Product.h
#pragma once
class Product
{
public:
Product();
virtual ~Product();
virtual void func();
};
//file: product.cpp #include "pch.h" #include "Product.h" Product::Product() {} Product::~Product() {} void Product::func() {}
Factory抽象類:
//file: Factory.h
#pragma once
#include "Product.h"
class Factory
{
public:
Factory();
virtual ~Factory();
virtual Product* factoryMethod();
};
//file: Factory.cpp #include "pch.h" #include "Factory.h" Factory::Factory() {} Factory::~Factory() {} Product* Factory::factoryMethod() { return nullptr; }
ConcreteProduct具體實現類:
//file: ConcreteProduct.h
#pragma once
#include "Product.h"
class ConcreteProduct : public Product
{
public:
ConcreteProduct();
virtual ~ConcreteProduct();
virtual void func();
};
//file: ConcreteProduct.cpp #include "pch.h" #include "ConcreteProduct.h" #include <iostream> ConcreteProduct::ConcreteProduct() {} ConcreteProduct::~ConcreteProduct() {} void ConcreteProduct::func() { std::cout << "Concrete Product's Func ." << std::endl; }
ConcreteFactory具體實現類:
//file: ConcreteFactory.h
#pragma once
#include "Factory.h"
class ConcreteFactory : public Factory
{
public:
ConcreteFactory();
virtual ~ConcreteFactory();
virtual Product* factoryMethod();
};
//file: ConcreteFactory.cpp
#include "pch.h"
#include "ConcreteFactory.h"
#include "ConcreteProduct.h"
ConcreteFactory::ConcreteFactory() {}
ConcreteFactory::~ConcreteFactory() {}
Product* ConcreteFactory::factoryMethod()
{
return new ConcreteProduct;
}
客戶端程式碼:
//file: FactoryMethodPattern.cpp : This file contains the 'main' function. Program execution begins and ends there.
#include "pch.h"
#include <iostream>
#include "ConcreteProduct.h"
#include "ConcreteFactory.h"
using namespace std;
int main()
{
Factory* fc = new ConcreteFactory();
Product* prod = fc->factoryMethod();
prod->func();
delete fc;
delete prod;
char c;
cin >> c;
return 0;
}
C#程式碼
Product抽象類以及ConcreteProduct具體實現類:
public abstract class Product
{
public virtual void Func()
{
Console.WriteLine("Basic Func Of The Product .");
}
}
public class ConcreteProduct : Product
{
public override void Func()
{
base.Func();
Console.WriteLine("The Concrete Product's External Func .");
}
}
Factory抽象類以及ConcreteFactory具體實現類:
public abstract class Factory
{
public abstract Product FactoryMethod();
}
public class ConcreteFactory : Factory
{
public override Product FactoryMethod()
{
return new ConcreteProduct();
}
}
客戶端程式碼:
using System;
namespace FactoryMethodPattern
{
class Program
{
static void Main(string[] args)
{
Factory fc = new ConcreteFactory();
Product prod = fc.FactoryMethod();
prod.Func();
Console.ReadKey(false);
}
}
}
REF
書籍:
設計模式與遊戲開發、大話設計模式
GitHub: