发布时间: 阅读量

设计模式笔记(一)工厂模式

前言

啥是设计模式?是不是就是写代码的套路,反正都是大佬们总结出来的,学呗!今天先来第一个简单点的,工厂模式


话不多说,开始实操

首先工厂模式分为三种,简单工厂模式,工厂方法模式,抽象工厂模式。先看第一种

简单工厂模式

特点:定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口

实例
  创建一个可以绘制不同形状的绘图工具,可以绘制圆形,正方形,三角形,每个图形都会有一个draw()方法用于绘图,不看代码先考虑一下如何通过该模式设计完成此功能。由题可知圆形,正方形,三角形都属于一种图形,并且都具有draw方法,所以首先可以定义一个接口或者抽象类,作为这三个图像的公共父类,并在其中声明一个公共的draw方法。

    public interface Shape {
   void draw();
}

下面就是编写具体的图形,每种图形都实现Shape 接口
圆形

    public class CircleShape implements Shape {

   public CircleShape() {
       System.out.println(  "CircleShape: created");
   }

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

}

正方形

    public class RectShape implements Shape {
   public RectShape() {
      System.out.println(  "RectShape: created");
   }

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

}

三角形

    public class TriangleShape implements Shape {

   public TriangleShape() {
       System.out.println(  "TriangleShape: created");
   }

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

}

下面是工厂类的具体实现

    public class ShapeFactory {
         public static final String TAG = "ShapeFactory";
         public static Shape getShape(String type) {
             Shape shape = null;
             if (type.equalsIgnoreCase("circle")) {
                 shape = new CircleShape();
             } else if (type.equalsIgnoreCase("rect")) {
                 shape = new RectShape();
             } else if (type.equalsIgnoreCase("triangle")) {
                 shape = new TriangleShape();
             }
             return shape;
         }
  }

在这个工厂类中通过传入不同的type可以new不同的形状,返回结果为Shape 类型,这个就是简单工厂核心的地方了.
只通过给ShapeFactory传入不同的参数就实现了各种形状的绘制,下面列子

    Shape shape= ShapeFactory.getShape("circle");
    shape.draw();

工厂方法模式

特点:工厂方法模式是简单工厂的仅一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说每个对象都有一个与之对应的工厂
实例
上面简单工厂例子中的图形接口以及相关图像实现类不变。我们只需要增加一个工厂接口以及实现这个接口的工厂类即可;
增加一个工厂接口

    public interface Factory {
    public Shape getShape();
}

增加相关工厂类

圆形工厂类

   public class CircleFactory implements Factory {

    @Override
    public Shape getShape() {
        // TODO Auto-generated method stub
        return new Circle();
    }

}

长方形工厂类

    public class RectangleFactory implements Factory{

    @Override
    public Shape getShape() {
        // TODO Auto-generated method stub
        return new Rectangle();
    }

}

圆形工厂类

    public class SquareFactory implements Factory{

    @Override
    public Shape getShape() {
        // TODO Auto-generated method stub
        return new Square();
    }

}

使用

     Factory circlefactory = new CircleFactory();
        Shape circle = circlefactory.getShape();
        circle.draw();