设计模式实践-简单工厂

场景

每种仪表都实现了统一的接口,设计一个工厂,生产不同的仪表

实现代码

仪表接口:

namespace DesignPatterns.SimpleFactory
{
    /// <summary>
    /// 仪表接口
    /// </summary>
    public interface IMeter
    {
        /// <summary>
        /// 显示仪表类型
        /// </summary>
        void ShowType();
    }
}

仪表A实现:

using System;

namespace DesignPatterns.SimpleFactory
{
    /// <summary>
    /// 仪表类型A
    /// </summary>
    internal class MeterA : IMeter
    {
        /// <summary>
        /// 显示仪表类型
        /// </summary>
        public void ShowType()
        {
            Console.WriteLine("Type A");
        }
    }
}

仪表B实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesignPatterns.SimpleFactory
{
    /// <summary>
    /// 仪表类型B
    /// </summary>
    internal class MeterB : IMeter
    {
        /// <summary>
        /// 显示仪表类型
        /// </summary>
        public void ShowType()
        {
            Console.WriteLine("Type B");
        }
    }
}

工厂接口:

namespace DesignPatterns.SimpleFactory
{
    /// <summary>
    /// 工厂接口
    /// </summary>
    public interface IMeterFactory
    {
        /// <summary>
        /// 生产仪表类型A
        /// </summary>
        /// <returns>仪表类型</returns>
        IMeter CreateMeterA();

        /// <summary>
        /// 生产仪表类型B
        /// </summary>
        /// <returns>仪表类型</returns>
        IMeter CreateMeterB();

        /// <summary>
        /// 根据需要的仪表类型生产仪表
        /// </summary>
        /// <param name="meterType">仪表类型</param>
        /// <returns>仪表对象</returns>
        IMeter CreateMeterByType(MeterType meterType);
    }
}

工厂实现:

namespace DesignPatterns.SimpleFactory
{
    /// <summary>
    /// 仪表工厂类
    /// </summary>
    public class MeterFactory : IMeterFactory
    {
        /// <summary>
        /// 生产类型A仪表
        /// </summary>
        /// <returns>类型A仪表</returns>
        public IMeter CreateMeterA()
        {
            return new MeterA();
        }

        /// <summary>
        /// 生产类型B仪表
        /// </summary>
        /// <returns>类型B仪表</returns>
        public IMeter CreateMeterB()
        {
            return new MeterB();
        }
    }
}

使用枚举类型生产仪表

仪表类型枚举:

namespace DesignPatterns.SimpleFactory
{
    /// <summary>
    /// 仪表类型枚举类
    /// </summary>
    public enum MeterType
    {
        /// <summary>
        /// 类型A 
        /// </summary>
        TypeA,

        /// <summary>
        /// 类型B 
        /// </summary>
        TypeB
    }
}

生产仪表方法:

......
        /// <summary>
        /// 根据需要的仪表类型生产仪表
        /// </summary>
        /// <param name="meterType">仪表类型</param>
        /// <returns>仪表对象</returns>
        public IMeter CreateMeterByType(MeterType meterType)
        {
            switch (meterType)
            {
                case MeterType.TypeA:
                    return new MeterA();
                case MeterType.TypeB:
                    return new MeterB();
                default:
                    return null;
            }
        }
......

静态工厂

静态工厂实现:

namespace DesignPatterns.SimpleFactory
{
    public static class StaticMeterFactory
    {
        public static IMeter CreateMeterA()
        {
            return new MeterA();
        }

        public static IMeter CreateMeterB()
        {
            return new MeterB();
        }

        public static IMeter CreateMeterByType(MeterType meterType)
        {
            switch (meterType)
            {
                case MeterType.TypeA:
                    return new MeterA();
                case MeterType.TypeB:
                    return new MeterB();
                default:
                    return null;
            }
        }
    }
}

相关调用

            IMeterFactory meterFactory = new MeterFactory();
            var meterA = meterFactory.CreateMeterA();
            var meterB = meterFactory.CreateMeterB();
            meterA.ShowType();
            meterB.ShowType();

            meterA = meterFactory.CreateMeterByType(MeterType.TypeA);
            meterB = meterFactory.CreateMeterByType(MeterType.TypeB);
            meterA.ShowType();
            meterB.ShowType();

            meterA = StaticMeterFactory.CreateMeterA();
            meterB = StaticMeterFactory.CreateMeterB();
            meterA.ShowType();
            meterB.ShowType();

Out:

Type A
Type B
Type A
Type B
Type A
Type B
posted @ 2016-07-07 21:45  4Thing  阅读(131)  评论(0编辑  收藏  举报