设计模式之-工厂模式

小YOY 创建于 2017-02-24

设计模式之-工厂模式

工厂模式

适用场景

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。该模式适用于复杂对象的创建,不需要对对象进行个性化。举生活中的例子,普通老百姓可能会做馒头,因为简单,自己买点面粉,查查食谱自己就可以做。对于馒头这个东西,我们没多大必要花钱去买别人的,在java中这种自制面包的模式等同于我们在程序中new一个对象,好处在于我们可以充分定制对象,比如我们馒头大一点还是小一点,需要加更多糖等。单对于汽车这种东西,单一工厂都不可能生产出来,还需要依赖其他工厂,这时候我们需要一辆汽车,倘若自己来生成一辆汽车基本上不可能,我们就需要工厂来帮我们生产,我们只需要付钱就行了,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现,在java中即为工厂模式,好处在于不必关系对象复制的构建过程,坏处在于定制化程度低,获取的对象必须是工厂能够生产的。

代码实现

个人觉得没必要完全按照网上的代码结构来写。我们只需要抓住一个核:创建对象的工作交给一个单独的类来进行,并且代码优雅可扩展就好。第一条核心是设计模式的本质,第二条核心是对模式的要求。比如我们有一个需求,需要创建一个工厂来创建某个类的实例。该对象可能会有多个子类型。可能优雅一点的设计是这样的,工厂方法接受一个参数用来告诉工厂生产的具体实例类型。这样我们只需要上传指定的参数就能工厂中得到我们需要获取的类型实例。但是你也可以这样写,我们对每种类型的实例都单独的去创建一个工厂,这样你需要使用对应的工厂来创建你的实例,就算是这样不优雅的代码个人觉得任然是工厂模式,因为他满足了工厂模式的核心:把创建对象的任务交个单独的类处理。只有代码怎么写完全看自己。

经典代码

Shape.java

    //抽象类
    public interface Shape{
        void draw();
    }

Rectangle.java

    public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Square.java

public class Square implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

工厂类ShapeFatory.java

public class ShapeFactory {
    public static Shape getShape(ShapeType shapeType){
        if(shapeType == null){
            return null;
        }
       if (shapeType.equals(ShapeType.RECTANGLE)){
            return new Rectangle();
        } else if(shapeType.equals(ShapeType.SQUARE)){
            return new Square();
        }
        return null;

    }

    public enum ShapeType{
        RECTANGLE,
        SQUARE
    }
}

使用场景FactoryPatternDemo.java

public class FactoryPatternDemo {

    //使用场景模拟
    public static void main(String[] args) {
        Shape rectangle = ShapeFactory.getShape(ShapeFactory.ShapeType.RECTANGLE);
        Shape square = ShapeFactory.getShape(ShapeFactory.ShapeType.SQUARE);
        rectangle.draw();
        square.draw();

    }
}

改进版本

  1. 多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建不同的对象。
  2. 静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
    正如上面代码实现提到的一样,改进版本只是在代码上变得更优雅,使用起来更方便。工厂方法模式的本质仍然没变。因此只要抓住了本质代码这些可以根据自己的思路进行书写。

总结

工厂模式的核心在于:将复杂的对象的创建工作交个单独的类来处理。