设计模式系列之-工厂方法

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

using DPC.Domain;
namespace DPC.CreateModel.FactoryMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建生产小米手机的工厂
            IMobilePhoneFactory xiaomiFactory = new XiaoMiFactory();
            MobilePhone xiaomi = xiaomiFactory.CreateMobilePhone(); //调用工厂对象生产手机的方法
            xiaomi.Show();
            Console.WriteLine();


            //创建生产苹果手机的工厂
            IMobilePhoneFactory iphoneFactory = new IPhoneFactory();
            MobilePhone iphone = iphoneFactory.CreateMobilePhone(); //调用工厂对象生产手机的方法
            iphone.Show();


            //Console.WriteLine();
            //工厂方法与简单工厂结合使用
            //MobliePhoneFactoryHelper.GetPhone("苹果").Show();
            //MobliePhoneFactoryHelper.GetPhone("小米").Show();
            Console.ReadKey();
        }
    }

    #region 工厂方法
    //工厂方法模式是对简单工厂模式的改造和升级,在工厂模式的基础上对简单工厂做了更高层次的抽象,抽象出工厂接口。
    //工厂方法模式符合对修改关闭、对扩展开放的原则,具有更好的扩展性。
    //但工厂方法模式引入了更高的代码复杂度,学习和调用成本更高,且创建每个类的实例都需要相关的工厂类配合,所以某些情况下需要增加很多相关类。
    //同时简单工厂和工厂方法结合可降低调用方的复杂度。


    /// <summary>
    /// 手机工厂接口(只要实现了该接口的类就是具备生产某种手机能力的工厂,这里有可能是苹果手机或者小米手机工厂)
    /// </summary>
    public interface IMobilePhoneFactory
    {
        MobilePhone CreateMobilePhone();
    }

    public class IPhoneFactory : IMobilePhoneFactory
    {
        public MobilePhone CreateMobilePhone()
        {
            return new IPhone("iphone6 plus", 6500);
        }
    }

    public class XiaoMiFactory : IMobilePhoneFactory
    {
        public MobilePhone CreateMobilePhone()
        {
            return new XiaoMi("小米2代", 2500);
        }
    }
    #endregion

    #region 工厂方法与简单工厂结合
    public class MobliePhoneFactoryHelper
    {
        public static MobilePhone GetPhone(string name)
        {
            IMobilePhoneFactory factory = null;
            switch (name)
            {
                case "苹果":
                    factory = new IPhoneFactory();
                    return factory.CreateMobilePhone();
                case "小米":
                    factory = new XiaoMiFactory();
                    return factory.CreateMobilePhone();
                default:
                    throw new NotImplementedException("不存在的品牌");
            }
        }
    }
    #endregion

}

 

posted @ 2015-01-27 15:59  玻璃鱼儿  阅读(178)  评论(0编辑  收藏  举报