Factory Method 模式
概念:使用 Template Method 模式来创建实例,称为 Factory Method 模式。父类决定生成实例的方式,但不决定所要生成的具体的类,具体处理交给子类。
示例
image.pngnamespace FactoryMethodPattern.Framework
{
/// <summary>
/// 产品
/// </summary>
public abstract class Product
{
/// <summary>
/// 使用
/// </summary>
public abstract void Use();
}
}
namespace FactoryMethodPattern.Framework
{
/// <summary>
/// 工厂
/// </summary>
internal abstract class Factory
{
/// <summary>
/// 创建
/// </summary>
/// <param name="owner"></param>
/// <returns></returns>
public Product Create(string owner)
{
var product = CreateProduct(owner);
Register(product);
return product;
}
/// <summary>
/// 创建产品
/// </summary>
/// <param name="owner"></param>
/// <returns></returns>
protected abstract Product CreateProduct(string owner);
/// <summary>
/// 注册
/// </summary>
/// <param name="product"></param>
protected abstract void Register(Product product);
}
}
using System;
using FactoryMethodPattern.Framework;
namespace FactoryMethodPattern.IdCards
{
/// <summary>
/// 身份证
/// </summary>
internal class IdCard : Product
{
public IdCard(string owner)
{
Console.WriteLine($"制作{Owner}的身份证");
Owner = owner;
}
/// <summary>
/// 持有人名称
/// </summary>
public string Owner { get; }
public override void Use()
{
Console.WriteLine($"使用{Owner}的证件");
}
}
}
using System.Collections.Generic;
using FactoryMethodPattern.Framework;
namespace FactoryMethodPattern.IdCards
{
/// <summary>
/// 身份证工厂
/// </summary>
internal class IdCardFactory : Factory
{
public IdCardFactory()
{
Owners = new List<string>();
}
/// <summary>
/// 持有人名称集合
/// </summary>
public List<string> Owners { get; set; }
protected override Product CreateProduct(string owner)
{
return new IdCard(owner);
}
protected override void Register(Product product)
{
Owners.Add(((IdCard) product).Owner);
}
}
}
using System;
using FactoryMethodPattern.Framework;
using FactoryMethodPattern.IdCards;
namespace FactoryMethodPattern
{
internal class Program
{
private static void Main(string[] args)
{
Factory factory = new IdCardFactory();
var p1 = factory.Create("小明");
var p2 = factory.Create("小妞");
var p3 = factory.Create("小三");
p1.Use();
p2.Use();
p3.Use();
Console.Read();
}
}
}
image.png
角色梳理
image.pngProduct:产品
抽象类,定义生成的实例所持有的接口,具体处理规则由子类 ConcreteProduct 决定。
Creator:创建者
负责创建 Product 的抽象类,具体的处理逻辑规则由子类 ConcreteCreator 决定。
不通过 new 关键字创建实例,而是调用生成实例的专用方法来生成实例,这样可以方式抽象(父)类与具体(子)类耦合。
ConcreteProduct:具体的产品
ConcreteCreator:具体的创建者
包含创建时的加工逻辑。
相关模式
Template Method 模式
Factory Method 模式是 Template Method 模式的典型应用。
Singleton 模式
Composite 模式
Iterator 模式
在使用迭代器创建实例时可以使用。
《图解设计模式》
网友评论