美文网首页
工厂模式

工厂模式

作者: W有来有去 | 来源:发表于2017-03-07 17:45 被阅读8次

    意图:

    定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行

    主要解决:

    主要解决接口选择的问题。

    何时使用:

    我们明确地计划不同条件下创建不同实例时。

    如何解决:

    让其子类实现工厂接口,返回的也是一个抽象的产品。

    关键代码:

    创建过程在其子类执行。

    优点:

    • 一个调用者想创建一个对象,只要知道其名称就可以了。
    • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
    • 屏蔽产品的具体实现,调用者只关心产品的接口。

    缺点:

    每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事

    实现:

    Design:
    我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory
    FactoryPatternDemo,我们的演示类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。

    工厂模式的 UML 图

    步骤:

    1. 创建一个接口:
      public interface Shape {
      void draw();
      }

    2. 创建实现接口的类:
      public class Circle implement Shape{
      @overide
      public void draw(){
      System.out.println("this is a Circle");
      }
      }

      public class Rectangle implement Shape{
         @overide
         public void draw(){
           System.out.println("this is a Rectangle");
         }   
      }
      
      public class Square implement Shape{
         @overide
         public void draw(){
           System.out.println("this is a Square");
         }   
      }
      
    3. 创建工厂类:
      public class ShapFactory{
      //使用 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;
      }
      }

    4. 调用工厂类创建实体的对象:

      public class FactoryPatternDemo {
      
           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();
        }
      }
      

    相关文章

      网友评论

          本文标题:工厂模式

          本文链接:https://www.haomeiwen.com/subject/svhmgttx.html