码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式学习——简单工厂模式

时间:2017-03-04 14:17:33      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:应用   lin   play   场景   条件   调用   type   代码实现   需要   

    模式概述:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,但其不属于23种GOF设计模式之一,通常它根据自变量的不同返回不同的类的实例。

    UML类图:

技术分享

 

    简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建出哪一个产品类的实例。由上图可以看出,简单工厂模式有工厂、抽象产品、具体产品三个角色。

    • 工厂角色(Factory) 
      是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。可被外界直接调用来创建产品对象

    • 抽象产品角色(Product)
      是简单工厂模式所创建的所有产品对象的父类,它负责描述所有实例所共有的公共接口

    • 具体产品角色(ConcreteProductA及ConcreteProductB)
      是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例

    应用场景:

    宠物的种类有很多,如Cat、Dog、Bird等等。首先,我们抽象出来一个Animal类,然后每个宠物类继承Animal类并实现父类的方法。

abstract class Animal
{
    public abstract void speak();
    public abstract void play();
}

class Cat:Animal
{
    public override void speak()
    {
        Console.WriteLine("喵喵");
    }
    public override void play()
    {
        Console.WriteLine("玩毛线团");
    }
}

class Dog:Animal
{
    public override void speak()
    {
        Console.WriteLine("汪汪");
    }
    public override void play()
    {
        Console.WriteLine("捡皮球 ");
    }
}

    然后,我们实现工厂角色Factory,定义一个静态方法生成Animal的实例。

class Factory
{
    public static Animal CreateAnimal(string type)
    {
        Animal animal=null;
        switch(type)
        {
            case "Cat":
                animal=new Cat();
                break;
            case "Dog":
                animal=new Dog();
                break;
        }
        return animal;
    }
}

    三个角色全部定义完成,下面看看客户端调用的代码实现

Animal animal;
animal=Factory.CreateAnimal("Cat");
animal.speak();
animal.play();

animal=Factory.CreateAnimal("Dog");
animal.speak();
animal.play();

    优势劣势:
  在简单工厂模式中,工厂类是整个模式的关键,其包含必要的判断逻辑,能够根据外界给定的信息,决定究竟创建哪个类的实例,外界可以不用去关注对象的创建,仅需要负责“消费”对象就可以了,明确区分了责任,有利于结构的优化。

  不过,简单工厂模式的缺点也体现在其工厂类上,该类集中了所有实例的创建逻辑,违反了高内聚的责任分配原则,当系统的具体产品类不断增多时,工厂类中条件判断过多,不利于扩展及维护,简单工厂模式的这些缺点,利用工厂方法模式可以得到一定的克服。

 

设计模式学习——简单工厂模式

标签:应用   lin   play   场景   条件   调用   type   代码实现   需要   

原文地址:http://www.cnblogs.com/huangshuhua/p/6501151.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!