当前位置: 首页 > news >正文

23种设计模式 -- 工厂模式

Java 工厂模式示例代码

下面我将展示三种常见的工厂模式实现:简单工厂模式、工厂方法模式和抽象工厂模式。

1. 简单工厂模式

java

// 产品接口
interface Shape {void draw();
}// 具体产品类
class Circle implements Shape {@Overridepublic void draw() {System.out.println("画一个圆形");}
}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("画一个矩形");}
}class Square implements Shape {@Overridepublic 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 {@Overridepublic void render() {System.out.println("<button>HTML按钮</button>");onClick();}@Overridepublic void onClick() {System.out.println("点击HTML按钮! 浏览器跳转");}
}class WindowsButton implements Button {@Overridepublic void render() {System.out.println("绘制Windows风格按钮");onClick();}@Overridepublic 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 {@Overridepublic Button createButton() {return new HtmlButton();}
}class WindowsDialog extends Dialog {@Overridepublic 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 {@Overridepublic void render() {System.out.println("渲染MacOS风格按钮");}@Overridepublic void onClick() {System.out.println("MacOS按钮点击事件");}
}class MacOSCheckbox implements Checkbox {@Overridepublic void paint() {System.out.println("渲染MacOS风格复选框");}
}class WindowsButton implements Button {@Overridepublic void render() {System.out.println("渲染Windows风格按钮");}@Overridepublic void onClick() {System.out.println("Windows按钮点击事件");}
}class WindowsCheckbox implements Checkbox {@Overridepublic void paint() {System.out.println("渲染Windows风格复选框");}
}// 具体工厂类
class MacOSFactory implements GUIFactory {@Overridepublic Button createButton() {return new MacOSButton();}@Overridepublic Checkbox createCheckbox() {return new MacOSCheckbox();}
}class WindowsFactory implements GUIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic 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();}
}

总结

  1. 简单工厂模式

    • 一个工厂类根据传入的参数决定创建哪种产品

    • 适用于产品较少且不经常变化的情况

  2. 工厂方法模式

    • 定义一个创建对象的接口,但让子类决定实例化哪个类

    • 适用于需要扩展性强、产品种类可能增加的情况

  3. 抽象工厂模式

    • 提供一个创建一系列相关或相互依赖对象的接口

    • 适用于产品族的情况,需要创建多个相关产品对象

每种模式都有其适用场景,选择哪种模式取决于具体的需求和设计目标。

相关文章:

  • Java—— Arrays工具类及Lambda表达式
  • 【JavaScript】if语句
  • 数据仓库建模:方法、技巧与实践
  • CH592/CH582 触摸按键应用开发实例讲解
  • 再看 BBR 到 BBRv3 的公平性改进
  • 【补题】ACPC Kickoff 2025 F. Kinan The Bank Robber
  • 三小时快速上手TypeScript之抽象类
  • Pytest-mark使用详解(跳过、标记、参数 化)
  • windows程序转鲲鹏服务器踩坑记【持续更新中】
  • 嘉黎县传统手工艺传承与发展交流会圆满举行
  • 3、CMake语法:制作和使用动态库和静态库
  • centos7使用yum快速安装Docker环境
  • openGauss DB4AI与scikit-learn模块对比探究
  • 大模型如何应对内容安全:原理、挑战与技术路径探讨
  • Vue 组件通信方式总览
  • 智能指针之设计模式6
  • 1.6二重积分
  • Python中的单例模式:深入探索元类与装饰器实现
  • 安卓基础(HashMap和ArrayList)
  • 注意力机制:从 MHA、MQA、GQA、MLA 到 NSA、MoBA
  • 诗词文赋俱当歌,听一听古诗词中的音乐性
  • 习近平:在庆祝中华全国总工会成立100周年暨全国劳动模范和先进工作者表彰大会上的讲话
  • 第二十届中国电影华表奖揭晓!完整获奖名单来了
  • 加拿大温哥华一车辆冲撞人群,造成多人伤亡
  • 闲暇时间的“堕落”
  • 中国与肯尼亚签署共同发展经济伙伴关系框架协定