常用的软件设计模式(二)简单工厂模式

刚参加工作的时候,丝毫没有面向对象的思想,所有分支都使用一堆的if...else...,现在回头看以前的代码,着实low。但是只要一心想着进步的人,一定是会总结和反省的,为什么以前的代码出现bug这么难维护,功能扩展那么难,代码难得到复用,过了段时间连自己写的代码都不知道什么意思。都说女孩子逻辑思维比不上男孩子,工作几年并没这种感觉,区别在于总结和分析罢了,只要比别人多一点耐心,多一点总结,一年之后就会发现那些和你同一起点的人已经远远被你甩在后面,不废话了,今天大猪蹄:简单工厂模式,告别眼花缭乱的if...else。

简单工厂模式:顾名思义,最少有一个生产产品的机器存在的工厂,有了这个工厂,当你需要某一对象时,传入一个正确的参数,就可以获取你所需要的对象,而无需知道其创建细节

优点:把分支封装在工厂类里,让工厂类判断用户需要什么对象,然后创建出什么对象,不用把分支代码开发出来,模块清晰化,各个部分各司其职

缺点:依然需要在工厂类的添加分支语句只是把if...else...改成了switch...case...,在添加新的产品时,既需要添加新的产品类,也需要修改工厂类的代码,这里就显得耦合性较高,不过这个问题也是有办法解决的,这个留到后面章节再讲

写一个特别简单的例子,客户需要根据名字获取不同类型的水果,如果是刚毕业的我,一定会写成下面这样:

        static void Main(string[] args)
        {
            Console.Write("请输入水果名称:");
            string fruitName = Console.ReadLine;
                switch (fruitName)
                {
                    case "Apple"://苹果
                        Console.Write("你要的苹果\t");
                        break;
                    case "Banana": //香蕉
                        Console.Write("你要的香蕉\t");
                        break;
                    default:
                        Console.Write("这里没有你要的水果\t");
                        break;
                }
        }

   简单工厂模式设计如下,包含以下几个类,用户类、工厂类、抽象产品类、具体产品类

//抽象产品类
public class FruitType
{
    public virtual void ShowFruit();
}


//苹果类
Class Apple:FruitType
{
    public override void ShowFruit()
    {
        Console.Write("你要的苹果\n\t");
    }
}


//香蕉类
Class Banana:FruitType
{
    public override void ShowFruit()
    {
        Console.Write("你要的香蕉\n\t");
    }
}


//工厂类
public class FruitFactory
{
    public static FruitType CreateFruit(string fruit)
    {
        FruitType fruitType = null;
        switch(fruitType)
        {
            case "apple":
                    fruitType = new Apple();
                    break;
            case "banana":
                    fruitType = new Banana();
                    break;
        }
        return fruitType;
    }
}

//客户类
Class Client
{
    FruitType fruitType;
    fruitType = FruitFactory.CreateFruit("apple");
    fruitType.ShowFruit();
}

猜你喜欢

转载自blog.csdn.net/Chenrongsake/article/details/82887124