工厂模式的一些个人改进if else

关于设计模式,园子有太多的介绍了,我就不去摆文弄墨了。

关于工厂模式,算是最简单,最好理解的设计模式了,当然,可能是最多的设计模式了。我这里说的并不是这个模式的用法,或者见解,这是个人对于这个模式的一些用法的改进而已。

好了,入正题。想必,可能大多数人写工厂模式的代码都是如此。但是,如果再增加一个IPlant的类,就必须地增加if条件判断。对于我这种对代码有洁癖的人,实在受不了。

namespace FactoryMode
{
    class Program
    {
        static void Main(string[] args)
        {
            var plant = PlantFactory.GetPlant("Jd");
        }
    }

    public interface IPlant
    {
        void DownLoad();

        void SendBackMsg();
    }

    public class PlantFactory
    {
        public static IPlant GetPlant(string plantName)
        {
            if (plantName == "Jd")
                return new JdPlant();
            if (plantName == "Tb")
                return new TbPlant();
            else
                return null;
        }
    }

    public class JdPlant : IPlant
    {

        public void DownLoad()
        {
            Console.WriteLine("Jd_DownLoad");
            //throw new NotImplementedException();
        }

        public void SendBackMsg()
        {
            Console.WriteLine("Jd_SendBackMsg");
            //throw new NotImplementedException();
        }
    }

    public class TbPlant : IPlant
    {
        public void DownLoad()
        {
            Console.WriteLine("Tb_DownLoad");
            //throw new NotImplementedException();
        }

        public void SendBackMsg()
        {
            Console.WriteLine("Tb_SendBackMsg");
            //throw new NotImplementedException();
        }
    }
}改进后的代码:
namespace FactoryMode
{
    class Program
    {
        static void Main(string[] args)
        {
            var plant = PlantFactory.GetPlant("Jd");
        }
    }

    public interface IPlant
    {
        void DownLoad();

        void SendBackMsg();
    }

    public class PlantFactory
    {
        private static Dictionary<string, Type> plantDictionary = new Dictionary<string, Type>();

        public PlantFactory()
        {
            plantDictionary.Add("Jd", typeof(JdPlant));
            plantDictionary.Add("Tb", typeof(TbPlant));

        }
        public static IPlant GetPlant(string plantName)
        {
            IPlant plant = null;
            if (plantDictionary.Keys.Contains(plantName))
            {
                plant = (IPlant)Activator.CreateInstance(plantDictionary[plantName]);
            }
            return plant;
        }
    }

    public class JdPlant : IPlant
    {

        public void DownLoad()
        {
            Console.WriteLine("Jd_DownLoad");
            //throw new NotImplementedException();
        }

        public void SendBackMsg()
        {
            Console.WriteLine("Jd_SendBackMsg");
            //throw new NotImplementedException();
        }
    }

    public class TbPlant : IPlant
    {
        public void DownLoad()
        {
            Console.WriteLine("Tb_DownLoad");
            //throw new NotImplementedException();
        }

        public void SendBackMsg()
        {
            Console.WriteLine("Tb_SendBackMsg");
            //throw new NotImplementedException();
        }
    }
}

				
时间: 2024-10-09 20:57:38

工厂模式的一些个人改进if else的相关文章

小菜学设计模式——抽象工厂模式

背景 简单工厂.工厂方法模式,接着必须学习抽象工厂模式 1.使用意图 扩展工厂方法模式 2.生活实例 淘宝电影.猫眼电影都能为我们生成当天各种电影票 3.Java 例子(框架.JDK .JEE) 个人觉得实实在在的根据抽象工厂模式定义的类应该会很少,毕竟不方便扩展,虽然它是一种很了不起的思想.一般都会采用反射机制+抽象工厂完成,比如,JDBC模块,在使用DriverManger.getConnection 这一步之前,必须要先加载驱动,也就是 Class.forname(class);这里指定c

【设计模式】简单工厂模式(改进后的)

在前一篇[简单工厂模式]中,使用计算器为例做了记录,在前文中提到了我写的简单工厂模式和书上讲得有点不同: 简单工厂模式只是用来创建对象,而关于此对象的操作是另外一回事,程序员需要手动根据工厂类创建的类对象(一般是父类对象指针,静态类型为父类,动态类型为子类,多态的基础). 而我在工厂内部加了一个GetResult函数,这个函数用来计算结果,计算结果的依据是根据工厂类的构造函数中的输入为工厂类的[计算器]抽象基类指针用new 子类()去赋值,然后调用计算结果虚函数. 刚才看了[大话设计模式]中讲得

抽象工厂模式

思考:工厂方法模式:http://www.cnblogs.com/maggiejyt/p/7561253.html 工厂方法模式UML: 问题:如果这家工厂不止要生产Ball(球),还要还有Sneakers(球鞋)等 则UML图为 当Product有多种类时则是抽象工厂模式 代码(Ball的代码见简单工厂模式:http://www.cnblogs.com/maggiejyt/p/7561253.html) Sneakers(球鞋抽象类) package com.maggie.FactoryMet

大话设计模式:抽象工厂模式

抽象方法模式:提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们具体的类. 三种模式的对比:   简单工厂模式 工厂模式 抽象工厂模式 产品 可以有多个但是都属于同一类, 同一等级.都继承产品抽象类. 可以有多个但是都属于同一类,同一等级. 都继承产品抽象类. 可以有不同种类的产品,每类有多中 具体产品: 抽象产品 只能有一个 只能有一个; 多个抽象产品类:每个抽象产品类可 以派生多种具体产品: 抽象工厂类   只能有一个,可以派生出多个具体工厂类: 只有一个,可派生出多个具体工厂类:

第15章 就不能换DB吗?—抽象工厂模式

由于抽象工厂在我们编程当中经常使用和常见,所有本篇文章对<大话设计模式>中的15章做了很详细的比较.通过一个Dao层可以更换访问任意数据库的例子来学习抽象工厂模式.例如:Dao层可以访问Sqlserver数据库,也可以访问Access数据库,当程序新增访问Oracle数据库时,无需修改现有代码,只需要添加访问Oracle相关的类就可以,实现了开闭原则.本篇文章的例子中每种数据库上都有User和Department表,我们Dao层对这两个表进行查询和插入操作. 最基本数据库访问 一下是访问Sql

详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博文,并不是像一些"非主流"的爱情观那样"宁缺毋滥". 只是其一呢,因为相当于给自己做一个总结,加深一下自己这方面的认识,因为掌握了和把它写出来我感觉后者还可以对技能有一个提升,其二呢是因为最近公司有一个内部的training需要讲设计模式. v写在前面 在这里呢,需要向

设计模式之创建型模式—— 1.3 抽象工厂模式

<?php /**  * 1.3 抽象工厂模式  * 解决的问题:  *  如何解决多个类实例化对象的问题.  * 解决的方案:  *  提供一个创建一系列相关或相互依赖对象的  *    接口,而无需指定它们具体的类.  * 该模式包含四种角色:  *  1. 抽象产品角色(两个或多个)  *  职责:同工厂方法模式  *    2. 具体产品角色  *    职责:同工厂方法模式  *      3. 抽象工厂角色  *    职责:同工厂方法模式  *      4. 具体工厂角色  * 

Java 实现简单工厂模式

工厂模式 属于创建型模式 简单工厂模式 通过一个厂类,以一个条件来创建对应的对象 //业务功能 public interface ICalculation { double getResult(double numA, double numB); } public class CalcAdd implements ICalculation { @Override public double getResult(double numA, double numB) { System.out.pri

学习日记之抽象工厂模式和Effective C++

抽象工厂模式(Abstract Factory):提供一个创建一系列相关或者相互依赖对象的接口.而无需制定他们详细的类. (1),工厂方法模式是定义一个用于创建对象的接口.让子类决定实例化哪一个类. (2),为创建不同的产品对象,client应使用不同的详细工厂. 抽象工厂模式的长处和缺点: (1).优点是便于交换产品系列,因为详细工厂类在一个应用中仅仅须要在初始化的时候出现一次,这就使得改变一个应用的详细工厂变得很easy.它仅仅须要改变详细工厂就可以使用不同的产品配置. (2),它让详细的创