美文网首页设计模式
第 4 章 Factory Method 模式 -- 将实例的生

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

作者: oO反骨仔Oo | 来源:发表于2018-08-31 18:04 被阅读0次
    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 模式

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

    《图解设计模式》

    相关文章

      网友评论

        本文标题:第 4 章 Factory Method 模式 -- 将实例的生

        本文链接:https://www.haomeiwen.com/subject/carewftx.html