Java 工厂模式示例代码
下面我将展示三种常见的工厂模式实现:简单工厂模式、工厂方法模式和抽象工厂模式。
1. 简单工厂模式
java
// 产品接口 interface Shape { void draw(); } // 具体产品类 class Circle implements Shape { @Override public void draw() { System.out.println("画一个圆形"); } } class Rectangle implements Shape { @Override public void draw() { System.out.println("画一个矩形"); } } class Square implements Shape { @Override public void draw() { System.out.println("画一个正方形"); } } // 简单工厂类 class ShapeFactory { // 使用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; } } // 测试类 public class SimpleFactoryDemo { public static void main(String[] args) { ShapeFactory shapeFactory = new ShapeFactory(); // 获取Circle对象并调用它的draw方法 Shape shape1 = shapeFactory.getShape("CIRCLE"); shape1.draw(); // 获取Rectangle对象并调用它的draw方法 Shape shape2 = shapeFactory.getShape("RECTANGLE"); shape2.draw(); // 获取Square对象并调用它的draw方法 Shape shape3 = shapeFactory.getShape("SQUARE"); shape3.draw(); } }
2. 工厂方法模式
java
// 产品接口 interface Button { void render(); void onClick(); } // 具体产品类 class HtmlButton implements Button { @Override public void render() { System.out.println("<button>HTML按钮</button>"); onClick(); } @Override public void onClick() { System.out.println("点击HTML按钮! 浏览器跳转"); } } class WindowsButton implements Button { @Override public void render() { System.out.println("绘制Windows风格按钮"); onClick(); } @Override public void onClick() { System.out.println("点击Windows按钮! 执行命令"); } } // 创建者抽象类 abstract class Dialog { public void renderWindow() { Button okButton = createButton(); okButton.render(); } // 工厂方法 public abstract Button createButton(); } // 具体创建者类 class HtmlDialog extends Dialog { @Override public Button createButton() { return new HtmlButton(); } } class WindowsDialog extends Dialog { @Override public Button createButton() { return new WindowsButton(); } } // 测试类 public class FactoryMethodDemo { private static Dialog dialog; public static void main(String[] args) { configure(); runBusinessLogic(); } static void configure() { if (System.getProperty("os.name").equals("Windows 10")) { dialog = new WindowsDialog(); } else { dialog = new HtmlDialog(); } } static void runBusinessLogic() { dialog.renderWindow(); } }
3. 抽象工厂模式
java
// 抽象产品接口 interface Checkbox { void paint(); } interface GUIFactory { Button createButton(); Checkbox createCheckbox(); } // 具体产品类 class MacOSButton implements Button { @Override public void render() { System.out.println("渲染MacOS风格按钮"); } @Override public void onClick() { System.out.println("MacOS按钮点击事件"); } } class MacOSCheckbox implements Checkbox { @Override public void paint() { System.out.println("渲染MacOS风格复选框"); } } class WindowsButton implements Button { @Override public void render() { System.out.println("渲染Windows风格按钮"); } @Override public void onClick() { System.out.println("Windows按钮点击事件"); } } class WindowsCheckbox implements Checkbox { @Override public void paint() { System.out.println("渲染Windows风格复选框"); } } // 具体工厂类 class MacOSFactory implements GUIFactory { @Override public Button createButton() { return new MacOSButton(); } @Override public Checkbox createCheckbox() { return new MacOSCheckbox(); } } class WindowsFactory implements GUIFactory { @Override public Button createButton() { return new WindowsButton(); } @Override public Checkbox createCheckbox() { return new WindowsCheckbox(); } } // 客户端代码 class Application { private Button button; private Checkbox checkbox; public Application(GUIFactory factory) { button = factory.createButton(); checkbox = factory.createCheckbox(); } public void paint() { button.render(); checkbox.paint(); } } // 测试类 public class AbstractFactoryDemo { private static Application configureApplication() { Application app; GUIFactory factory; String osName = System.getProperty("os.name").toLowerCase(); if (osName.contains("mac")) { factory = new MacOSFactory(); } else { factory = new WindowsFactory(); } app = new Application(factory); return app; } public static void main(String[] args) { Application app = configureApplication(); app.paint(); } }
总结
-
简单工厂模式:
-
一个工厂类根据传入的参数决定创建哪种产品
-
适用于产品较少且不经常变化的情况
-
-
工厂方法模式:
-
定义一个创建对象的接口,但让子类决定实例化哪个类
-
适用于需要扩展性强、产品种类可能增加的情况
-
-
抽象工厂模式:
-
提供一个创建一系列相关或相互依赖对象的接口
-
适用于产品族的情况,需要创建多个相关产品对象
-
每种模式都有其适用场景,选择哪种模式取决于具体的需求和设计目标。