C#设计:工厂模式

写在

在学习设计模式的时候发现很多对于工厂模式的例子都是很简单的,例如就是用工厂类直接去创建一些无构造参数的简单的实例,这也的创建方式和我们直接new相应的实例没什么差别,体现不出工厂的优势。当需要创建的实例之间具有复杂的依赖关系或者需要创建模式的实例的时候工厂获取创建实例的优势就出现了。

例如这样一个例子(来自菜鸟):

public class ShapeFactory {

   //使用 getShape 方法获取形状类型的对象
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }        
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
   }
}

这个工厂负责实例化不同的图形,通过传入的字符来new出不同的对象

   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();
 
      //获取 Circle 的对象,并调用它的 draw 方法
      Shape shape1 = shapeFactory.getShape("CIRCLE");
 
      //调用 Circle 的 draw 方法
      shape1.draw();
 
      //获取 Rectangle 的对象,并调用它的 draw 方法
      Shape shape2 = shapeFactory.getShape("RECTANGLE");
 
      //调用 Rectangle 的 draw 方法
      shape2.draw();
 
      //获取 Square 的对象,并调用它的 draw 方法
      Shape shape3 = shapeFactory.getShape("SQUARE");
 
      //调用 Square 的 draw 方法
      shape3.draw();
   }

在测试函数这里创建了一个工厂,然后在工厂内传入需要的对象名可以获得这个对象实例,需要不同的实例的时候只要改这个参数即可,如果使用直接创建对象的方式也是只需要改创建对象时的对象名就可以了,这样看上去工厂模式和普通的方式没啥区别。

下面来看一个复杂一点点的示例:

假设轿车的制造流程如下:

  1. 创建车身
  2. 安装引擎
  3. 安装座椅
  4. 安装车轮
  5. 安装音响系统

在轿车工厂中,我们需要按照上述制造流程进行车辆的制造。下面是一个简化版的代码实现:

public class SedanFactory : CarFactory
{
    public override Car CreateCar()
    {
        // 创建车身
        Body body = new Body();

        // 安装引擎
        Engine engine = new Engine();
        body.InstallEngine(engine);

        // 安装座椅
        Seat seat = new Seat();
        body.InstallSeat(seat);

        // 安装车轮
        Wheel wheel = new Wheel();
        body.InstallWheel(wheel);

        // 安装音响系统
        AudioSystem audioSystem = new AudioSystem();
        body.InstallAudioSystem(audioSystem);

        return new Sedan(body, engine, seat, wheel, audioSystem);
    }
}

public class Sedan
{
    public Body Body { get; }
    public Engine Engine { get; }
    public Seat Seat { get; }
    public Wheel Wheel { get; }
    public AudioSystem AudioSystem { get; }

    public Sedan(Body body, Engine engine, Seat seat, Wheel wheel, AudioSystem audioSystem)
    {
        Body = body;
        Engine = engine;
        Seat = seat;
        Wheel = wheel;
        AudioSystem = audioSystem;
    }

    public void Drive()
    {
        Console.WriteLine("Driving a Sedan");
    }
}

// 具体的车身、引擎、座椅、车轮、音响系统类的定义

在这个示例中,轿车的创建过程包括了多个步骤,例如创建车身、安装引擎、安装座椅、安装车轮和安装音响系统。在轿车工厂类中,我们按照这个制造流程创建了一个完整的轿车对象,并返回给客户端使用。由于制造流程比较复杂,使用工厂模式可以将这个复杂的过程封装起来,客户端代码只需要调用工厂方法即可创建对象,无需了解具体的创建细节。


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注