设计模式实践-简单工厂
场景
每种仪表都实现了统一的接口,设计一个工厂,生产不同的仪表
实现代码
仪表接口:
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
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号