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

设计模式之工厂模式讲解与案例

工厂模式是一种创建对象的设计模式,它通过提供一个统一的接口来创建对象,隐藏了具体对象的实例化过程。Java中的工厂模式有多种实现方式,下面我将举两个常见的例子。

简单工厂模式(Simple Factory Pattern):

简单工厂模式通过一个工厂类来创建对象,根据不同的参数类型返回相应的实例。这种方式适用于创建的对象较少且不会频繁修改的情况。

// 抽象产品接口
interface Product {void use();
}// 具体产品类A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("使用产品A");}
}// 具体产品类B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("使用产品B");}
}// 简单工厂类
class SimpleFactory {public static Product createProduct(String type) {if (type.equals("A")) {return new ConcreteProductA();} else if (type.equals("B")) {return new ConcreteProductB();}throw new IllegalArgumentException("Unsupported product type.");}
}// 使用工厂创建产品
public class Main {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.use();  // 输出:使用产品AProduct productB = SimpleFactory.createProduct("B");productB.use();  // 输出:使用产品B}
}

工厂方法模式(Factory Method Pattern):

工厂方法模式将对象的创建交给子类来实现,每个子类负责创建一种具体的产品。这种方式适用于需要创建多种具体产品的情况。


// 抽象产品接口
interface Product {void use();
}// 具体产品类A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("使用产品A");}
}// 具体产品类B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("使用产品B");}
}// 抽象工厂类
abstract class Factory {public abstract Product createProduct();
}// 具体工厂类A
class ConcreteFactoryA extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}// 具体工厂类B
class ConcreteFactoryB extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}// 使用工厂创建产品
public class Main {public static void main(String[] args) {Factory factoryA = new ConcreteFactoryA();Product productA = factoryA.createProduct();productA.use();  // 输出:使用产品AFactory factoryB = new ConcreteFactoryB();Product productB = factoryB.createProduct();productB.use();  // 输出:使用产品B}
}

总结

上面两种方式有什么不同

简单工厂模式和工厂方法模式的主要区别在于创建对象的方式不同。

简单工厂模式通过一个工厂类来创建对象,客户端只需要知道所需产品的类型即可获得该产品的实例,具有较高的简洁性。但是它的缺点是工厂类中包含了所有产品的实现逻辑,当新增加产品时需要修改工厂类的代码,违背了开闭原则

工厂方法模式将创建对象的行为交给了子类来实现,每个具体工厂类只负责创建一种具体产品,更符合开闭原则。但是它的缺点是需要为每个产品都创建一个对应的具体工厂类,增加了类的数量,复杂度较高。

因此,在使用工厂模式时,需要根据实际情况选择相应的实现方式。如果产品的种类较少且不会频繁变化,可以考虑使用简单工厂模式;如果产品的种类较多且会经常变化,可以选择工厂方法模式。

http://www.lryc.cn/news/217495.html

相关文章:

  • (免费领源码)php#MySQL软件测试文档管理系统28035-计算机毕业设计项目选题推荐
  • 05.Oracle数据库对象
  • 某国产中间件企业:提升研发安全能力,助力数字化建设安全发展
  • Servlet中主要的内置对象
  • STL-set和map
  • 【WinForm详细教程四】WinForm中的ProgressBar 、ImageList和ListView控件
  • 写一个简单实用的Excel工具类
  • C#中LINQtoObjects、LINQtoDataSet和LINQtoXML
  • k8s中 RBAC中,clusterrole,serviceaccount , rolebinding 是什么关系谁先谁后
  • 什么是文件安全
  • maven的settings.xml和pom.xml配置文件详解
  • YB2503HV 100V 3A SOP8内置MOS 高效率降压IC(昱灿)
  • Redis安装Linux
  • PCL点云处理(007)-Ransac
  • 有方N58 HTTP POST 请求连接 TDengine
  • 基于Python+Pygame实现一个滑雪小游戏
  • 【限制输入框值类型】自定义指令el-input输入类型限制,vue和html两个版本
  • 对一个金融风控测额公式的理解(1)
  • 【GEE】2、探索数据集
  • 开发一款直播弹幕游戏需要多少钱?
  • STM32F103C8T6第一天:认识STM32 标准库与HAL库 GPIO口 推挽输出与开漏输出
  • selenium元素定位 —— 提高篇 CSS定位元素
  • 隔离和非隔离电源的区别
  • C语言自定义数据类型
  • SoftwareTest5 - 你就只知道功能测试吗 ?
  • Uniapp 中,能够同时兼容H5、web、app、微信小程序的引入高德地图的语法格式
  • 基于nodejs+vue网上鲜花销售系统
  • stm32 ETH
  • 【深度学习基础】Pytorch框架CV开发(2)实战篇
  • C语言--输出1-100以内同时能被3和5整除的数