设计模式之三种工厂模式总结(简单工厂、工厂方法、抽象工厂)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Frank_Adam/article/details/79459015

三种工厂模式总结(简单工厂、工厂方法、抽象工厂)


  1. 简单工厂模式

    • 核心

      具体工厂+抽象产品+具体产品。

    • 实例

      创建一个可绘制不同形状的绘图工具,可以绘制圆形、正方形、三角形,每个图形通过调用draw()方法绘图。

    • 思想

      1. 定义图形抽象接口
      2. 实例化三种图形
      3. 创建工厂类并构建创建图形方法,根据传入的字符串判断图形类型
    • 产品设计

      interface Shape:

      public interface Shape {
       void draw();
      }

      class CircleShape:

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

      class TriangleShape:

      public class TriangleShape implements Shape{
       @Override
       public void draw() {
           System.out.println("TrangleShape.draw()");
       }
      }

      class SquareShape:

      public class SquareShape implements Shape{
       @Override
       public void draw() {
           System.out.println("SquareShape.draw()");
       }
      }
    • 工厂设计

      class ShapeFactory:

      public class ShapeFactory {
      
       public static Shape createShape(String type) {
           if(type.equalsIgnoreCase("circle")) {
               return new CircleShape();
           } else if (type.equalsIgnoreCase("square")) {
               return new SquareShape();
           } else if (type.equalsIgnoreCase("triangle")){
               return new TriangleShape();
           } else {
               return null;
           }
       }
      
      }
    • 测试

      public static void main(String[] args) {
       Shape circle = ShapeFactory.createShape("circle");
       circle.draw();
       Shape square = ShapeFactory.createShape("square");
       square.draw();
       Shape triangle = ShapeFactory.createShape("triangle");
       triangle.draw();
      }
    • 运行结果

      CircleShape.draw()
      SquareShape.draw()
      TrangleShape.draw()

  2. 工厂方法模式

    • 核心

      抽象工厂+具体工厂+抽象产品+具体产品。

    • 实例

      设计一个图片加载类,具有多个图片加载器,分别对应jpg/png/gif格式的图片,加载器通过调用loadImage()方法读取图片。

    • 思想

      1. 创建图片加载器抽象接口
      2. 实例化三种图片加载器
      3. 创建图片加载器工厂抽象接口
      4. 实例化三种图片加载器工厂
      5. 调用时通过相应的图片加载器工厂得到图片加载器实例。
    • 产品设计

      interface ImageLoader:

      public interface ImageLoader {
       void loadImage();
      }

      class JpgImageLoader:

      public class JpgImageLoader implements ImageLoader{
       @Override
       public void loadImage() {
           System.out.println("JpgImageLoader.loadImage()");
       }
      }

      class PngImageLoader:

      public class PngImageLoader implements ImageLoader{
       @Override
       public void loadImage() {
           System.out.println("PngImageLoader.loadImage()");
       }
      }

      class GifImageLoader:

      public class GifImageLoader implements ImageLoader {
       @Override
       public void loadImage() {
           System.out.println("GifImageLoader.loadImage()");
       }
      }
    • 工厂设计

      interface ImageLoaderFactory:

      public interface ImageLoaderFactory {
       ImageLoader getImageLoader();
      }

      class JpgImageLoaderFactory:

      public class JpgImageLoaderFactory implements ImageLoaderFactory{
       @Override
       public ImageLoader getImageLoader() {
           return new JpgImageLoader();
       }
      }

      class PngImageLoaderFactory:

      public class PngImageLoaderFactory implements ImageLoaderFactory{
       @Override
       public ImageLoader getImageLoader() {
           return new PngImageLoader();
       }
      }

      class GifImageLoaderFactory:

      public class GifImageLoaderFactory implements ImageLoaderFactory{
       @Override
       public ImageLoader getImageLoader() {
           return new GifImageLoader();
       }
      }
    • 测试

      public static void main(String[] args) {
       ImageLoader jpgLoader = new JpgImageLoaderFactory().getImageLoader();
       jpgLoader.loadImage();
       ImageLoader pngLoader = new PngImageLoaderFactory().getImageLoader();
       pngLoader.loadImage();
       ImageLoader gifLoader = new GifImageLoaderFactory().getImageLoader();
       gifLoader.loadImage();
      }
    • 运行结果

      JpgImageLoader.loadImage()
      PngImageLoader.loadImage()
      GifImageLoader.loadImage()

  3. 抽象工厂模式

    • 核心

      抽象工厂+具体工厂+抽象产品+具体产品(与前者的区别在于这里的工厂可以生产多种产品)

    • 实例

      设计一个系统适配类,需要兼容Android/iOS/WP三种移动操作系统,对于每种系统设计相应的操作控制器和界面控制器。

    • 思想

      1. 设计操作控制器和界面控制器抽象接口。
      2. 实例化三种系统的操作控制器和界面控制器。
      3. 设计系统适配器工厂抽象接口。
      4. 实例化三种系统的系统适配器工厂。
      5. 调用时通过相应的系统适配器工厂获得相应的控制器。
    • 产品设计

      interface UIController:

      public interface UIController {
       void display();
      }

      interface OperationController:

      public interface OperationController {
       void control();
      }

      class AndroidUIController:

      public class AndroidUIController implements UIController{
       @Override
       public void display() {
           System.out.println("AndroidUIController.display()");
       }
      }

      class AndroidOperationController:

      public class AndroidOperationController implements OperationController{
       @Override
       public void control() {
           System.out.println("AndroidOperationController.control()");
       }
      }

      class IOSUIController:

      public class IOSUIController implements UIController{
       @Override
       public void display() {
           System.out.println("IOSUIController.display()");
       }
      }

      class IOSOperationController:

      public class IOSOperationController implements OperationController{
       @Override
       public void control() {
           System.out.println("IOSOperationController.control()");
       }
      }

      class WPUIController:

      public class WPUIController implements UIController{
       @Override
       public void display() {
           System.out.println("WPUIController.display()");
       }
      }

      class WPOperationController:

      public class WPOperationController implements OperationController{
       @Override
       public void control() {
           System.out.println("WPOperationController.control()");
       }
      }
    • 工厂设计

      interface SystemAdaptorFactory:

      public interface SystemAdaptorFactory {
       OperationController getOperationController();
       UIController getUIController();
      }

      class AndroidSystemAdaptorFactory:

      public class AndroidSystemAdaptorFactory implements SystemAdaptorFactory{
       @Override
       public OperationController getOperationController() {
           return new AndroidOperationController();
       }
      
       @Override
       public UIController getUIController() {
           return new AndroidUIController();
       }
      }

      class IOSSystemAdaptorFactory:

      public class IOSSystemAdaptorFactory implements SystemAdaptorFactory{
       @Override
       public OperationController getOperationController() {
           return new IOSOperationController();
       }
      
       @Override
       public UIController getUIController() {
           return new IOSUIController();
       }
      }
      

      class WPSystemAdaptorFactory:

      public class WPSystemAdaptorFactory implements SystemAdaptorFactory{
       @Override
       public OperationController getOperationController() {
           return new WPOperationController();
       }
      
       @Override
       public UIController getUIController() {
           return new WPUIController();
       }
      }
    • 测试

      public static void main(String[] args) {
       SystemAdaptorFactory androidSystemAdaptorFactory = new AndroidSystemAdaptorFactory();
       OperationController androidOperationController = androidSystemAdaptorFactory.getOperationController();
       UIController androidUIController = androidSystemAdaptorFactory.getUIController();
       androidOperationController.control();
       androidUIController.display();
      
       SystemAdaptorFactory iosSystemAdaptorFactory = new IOSSystemAdaptorFactory();
       OperationController iosOperationController = iosSystemAdaptorFactory.getOperationController();
       UIController iosUIController = iosSystemAdaptorFactory.getUIController();
       iosOperationController.control();
       iosUIController.display();
      
       SystemAdaptorFactory wpSystemAdaptorFactory = new WPSystemAdaptorFactory();
       OperationController wpOperationController = wpSystemAdaptorFactory.getOperationController();
       UIController wpUIController = wpSystemAdaptorFactory.getUIController();
       wpOperationController.control();
       wpUIController.display();
      }
    • 运行结果

      AndroidOperationController.control()
      AndroidUIController.display()
      IOSOperationController.control()
      IOSUIController.display()
      WPOperationController.control()
      WPUIController.display()

猜你喜欢

转载自blog.csdn.net/Frank_Adam/article/details/79459015