设计模式

第 4 章 Factory Method 模式 -- 将实例的生

2018-08-31  本文已影响0人  oO反骨仔Oo
image.png

Factory Method 模式

概念:使用 Template Method 模式来创建实例,称为 Factory Method 模式。父类决定生成实例的方式,但不决定所要生成的具体的类,具体处理交给子类。

示例

image.png
namespace 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.png

Product:产品

抽象类,定义生成的实例所持有的接口,具体处理规则由子类 ConcreteProduct 决定。

Creator:创建者

负责创建 Product 的抽象类,具体的处理逻辑规则由子类 ConcreteCreator 决定。
不通过 new 关键字创建实例,而是调用生成实例的专用方法来生成实例,这样可以方式抽象(父)类与具体(子)类耦合。

ConcreteProduct:具体的产品

ConcreteCreator:具体的创建者

包含创建时的加工逻辑。

相关模式

Template Method 模式

Factory Method 模式是 Template Method 模式的典型应用。

Singleton 模式

Composite 模式

Iterator 模式

在使用迭代器创建实例时可以使用。

《图解设计模式》

上一篇 下一篇

猜你喜欢

热点阅读