三种工厂模式总结(简单工厂、工厂方法、抽象工厂)
-
简单工厂模式
-
核心
具体工厂+抽象产品+具体产品。
-
实例
创建一个可绘制不同形状的绘图工具,可以绘制圆形、正方形、三角形,每个图形通过调用draw()方法绘图。
-
思想
- 定义图形抽象接口
- 实例化三种图形
- 创建工厂类并构建创建图形方法,根据传入的字符串判断图形类型
-
产品设计
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()
-
-
工厂方法模式
-
核心
抽象工厂+具体工厂+抽象产品+具体产品。
-
实例
设计一个图片加载类,具有多个图片加载器,分别对应jpg/png/gif格式的图片,加载器通过调用loadImage()方法读取图片。
-
思想
- 创建图片加载器抽象接口
- 实例化三种图片加载器
- 创建图片加载器工厂抽象接口
- 实例化三种图片加载器工厂
- 调用时通过相应的图片加载器工厂得到图片加载器实例。
-
产品设计
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()
-
-
抽象工厂模式
-
核心
抽象工厂+具体工厂+抽象产品+具体产品(与前者的区别在于这里的工厂可以生产多种产品)
-
实例
设计一个系统适配类,需要兼容Android/iOS/WP三种移动操作系统,对于每种系统设计相应的操作控制器和界面控制器。
-
思想
- 设计操作控制器和界面控制器抽象接口。
- 实例化三种系统的操作控制器和界面控制器。
- 设计系统适配器工厂抽象接口。
- 实例化三种系统的系统适配器工厂。
- 调用时通过相应的系统适配器工厂获得相应的控制器。
-
产品设计
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()
-