设计模式之工厂

有三种模式的工厂:简单工厂,工厂方法,抽象工厂,主要是用来抽象化对象的创建工作的。

1.简单工厂

又叫做静态工厂建方法(Static Factory Method)模式

我们需要根据不同的条件创造不同的对象,将创造对象的工作集成到一个工厂里,由一个工厂对象来负责所有产品类的创建,由一个工厂来决定要创建出哪一种产品类的实例,这个就是简单工厂。

public class Product
{
    public virtual void what() 
    {
    }

}
public class Car : Product
{
    public override void what()
    {
        Console.Write("a car");
    }
}
public class Bus : Product
{
    public override void what()
    {
        Console.Write("a bus");
    }
}

public class ProductFactory
{
    public static Product Create(string product)
    {
        Product pro = null;
        switch (product)
        {
            case "car":
                pro = new Car();
                break;
            case "bus":
                pro = new Bus();
                break;
        }
        return pro;
    }
}

namespace model
{
    class Program
    {

        static void Main(string[] args)
        {
            Product pro = ProductFactory.Create("car");
            pro.what();
            Console.Read();
        }
    }
}
View Code

上例由ProductFactory来决定是要创建Car还是Bus。

这种模式的优点在于摆脱了直接创建具体产品对象的烦琐,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的,当产品类增加时,只需要增加产品类和修改工厂方法。

 

 2.工厂方法

是由不同的工厂来具体生产不同产品类的实例。比如汽车工厂生产汽车,公共汽车工厂生产公共汽车

public class Product
{
    public virtual void what() 
    {
    }

}
public class Car : Product
{
    public override void what()
    {
        Console.Write("a car");
    }
}
public class Bus : Product
{
    public override void what()
    {
        Console.Write("a bus");
    }
}
interface IFactory
{
    Product Create();
}
public class CarFactory:IFactory
{
    public Product Create()
    {
        return new Car();
    }
}
public class BusFactory : IFactory
{
    public Product Create()
    {
        return new Bus();
    }
}
namespace model
{
    class Program
    {

        static void Main(string[] args)
        {
            IFactory fac = new CarFactory();
            Product pro = fac.Create();
            pro.what();
            Console.Read();
        }
    }
}
View Code

核心类仅仅负责给出工厂生产对象的接口,而不接触工厂生产产品类的这种细节。这使得工厂方法模式可以允许系统在不修改已有工厂和产品的情况下引进新的工厂和产品。

 

3.抽象工厂

对于同种类的产品,不同的工厂生产不同类型的,比如不同蛋糕店虽然都生产蛋糕,但是蛋糕的口味不一样,是不同类型的蛋糕。比如汽车工厂和公共汽车工厂都生产轮子,但是一个是汽车轮子,一个是公汽轮子

public class Product
{
    public virtual void what() 
    {
    }

}
public class Wheel
{
    public virtual void usage()
    {
    }
}
public class Car : Product
{
    public override void what()
    {
        Console.Write("a car");
    }
}
public class Bus : Product
{
    public override void what()
    {
        Console.Write("a bus");
    }
}
public class CarWheel:Wheel
{
    public override void usage()
    {
        Console.Write("a wheel for car");
    }
}
public class BusWheel : Wheel
{
    public override void usage()
    {
        Console.Write("a wheel for bus");
    }
}
interface IFactory
{
    Product CreateProduct();
    Wheel CreateWheel();
}
public class CarFactory:IFactory
{
    public Product CreateProduct()
    {
        return new Car();
    }
    public Wheel CreateWheel()
    {
        return new CarWheel();
    }
}
public class BusFactory : IFactory
{
    public Product CreateProduct()
    {
        return new Bus();
    }
    public Wheel CreateWheel()
    {
        return new BusWheel();
    }
}
namespace model
{
    class Program
    {

        static void Main(string[] args)
        {
            IFactory fac = new CarFactory();
            Wheel wel = fac.CreateWheel();
            wel.usage();
            Console.Read();
        }
    }
}
View Code

抽象工厂模式使得我们易于更换产品系列,有利于产品的一致性。使我们不用关心产品的类型,只需要找到负责生产该类型产品的工厂,要求工厂生产这一系列的商品就可以了。

 

posted @ 2013-11-04 10:53  Jingle Guo  阅读(997)  评论(2编辑  收藏  举报