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

java-设计模式-4-创建型模式-工厂

java-设计模式-4-创建型模式-工厂(简单工厂,工厂方法,抽象工厂)

工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。

简单工厂

分析:
Factory: 工厂角色
Product:抽象产品角色
ConcreteProduct:具体产品角色

//工厂角色
public class CarFactory {public CarProduct newCar(String name){//核心代码。if("xm".equals(name)){return new XMProduct();}else if("tsl".equals(name)){return new TSLProduct();}return  null;}public static void main(String[] args) {CarFactory carFactory = new CarFactory();CarProduct xmCP = carFactory.newCar("xm");CarProduct tslCP = carFactory.newCar("tsl");xmCP.run();tslCP.run();}
}
//抽象产品角色
abstract class CarProduct{public String name;public abstract void run();
}
//抽象产品的具体产品
class XMProduct extends CarProduct{public XMProduct(){this.name = "小米汽车";}@Overridepublic void run() {System.out.println(this.name+"正在跑。");}
}
//抽象产品的具体产品2
class TSLProduct extends CarProduct{public TSLProduct(){this.name = "特斯拉";}@Overridepublic void run() {System.out.println(this.name+"正在跑。");}
}

工厂方法

分析:
四个角色
Product:抽象产品
ConcreteProduct:具体产品
Factory:抽象工厂
ConcreteFactory:具体工厂

public class MainTest {public static void main(String[] args) {AbstractFactory carFactory = new BJXMFactory();CarProduct carProduct = carFactory.newCar();carProduct.run();AbstractFactory tslCarFactory = new BJTSLFactory();CarProduct tslCarProduct = tslCarFactory.newCar();tslCarProduct.run();}
}
//抽象工厂
abstract class AbstractFactory{public abstract CarProduct newCar();
}
//抽象工厂的具体产品1
class BJXMFactory extends AbstractFactory{public CarProduct newCar() {return new XMProduct();}
}
//抽象工厂的具体产品2
class BJTSLFactory extends AbstractFactory{@Overridepublic CarProduct newCar() {return new TSLProduct();}
}
//抽象产品角色
abstract class CarProduct{public String name;public abstract void run();
}
//抽象产品的具体产品1
class XMProduct extends CarProduct {public XMProduct(){this.name = "小米汽车";}@Overridepublic void run() {System.out.println(this.name+"正在跑。");}
}
//抽象产品的具体产品2
class TSLProduct extends CarProduct {public TSLProduct(){this.name = "特斯拉";}@Overridepublic void run() {System.out.println(this.name+"正在跑。");}
}

缺点:系统复杂度增加,产品单一

抽象工厂

//抽象工厂
public abstract class AbstractFactory {//生成车产品abstract CarProduct newCar();//生成口罩产品,抽象工厂abstract Mask newMask();public static void main(String[] args) {AbstractFactory whMaskFactory = new WHMaskFactory();Mask mask = whMaskFactory.newMask();mask.protectMe();System.out.println("====================");AbstractFactory bjxmCarFactory = new BJXMCarFactory();CarProduct carProduct = bjxmCarFactory.newCar();carProduct.run();}
}
//具体工厂
class WHMaskFactory extends AbstractFactory{@OverrideCarProduct newCar() {return null;}@OverrideMask newMask() {return new N95Mask();}
}
//具体工厂
class BJXMCarFactory extends AbstractFactory{@OverrideCarProduct newCar() {return  new XMProduct();}@OverrideMask newMask() {return null;}
}//口罩抽象类
abstract class Mask{public String price;public abstract void protectMe();
}
class N95Mask extends Mask{public N95Mask(){this.price = "1元";}@Overridepublic void protectMe() {System.out.println("价格:"+this.price);System.out.println("N95保护我");}
}
class CommonMask extends Mask{public CommonMask(){this.price = "0.5元";}@Overridepublic void protectMe() {System.out.println("价格:"+this.price);System.out.println("普通口罩保护我");}
}
//抽象产品角色
abstract class CarProduct{public String name;public abstract void run();
}
//抽象产品的具体产品
class XMProduct extends CarProduct {public XMProduct(){this.name = "小米汽车";}@Overridepublic void run() {System.out.println(this.name+"正在跑。");}
}
//抽象产品的具体产品2
class TSLProduct extends CarProduct {public TSLProduct(){this.name = "特斯拉";}@Overridepublic void run() {System.out.println(this.name+"正在跑。");}
}

工厂模式的退化
当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式;当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成简单工厂模式。

java应用场景
NumberFormat、SimpleDateFormat

http://www.xdnf.cn/news/19700.html

相关文章:

  • 【52页PPT】服务业数字化转型如何做(附下载方式)
  • Ubuntu 用户和用户组
  • X86、X64 与 ARM:架构的剖析与比较
  • webpack性能优化指南
  • MacOS - 记录MacOS发烫的好几天 - 幕后黑手竟然是
  • 神经网络|(十八)概率论基础知识-伽马函数溯源-阶乘的积分表达式
  • k8s常用命令
  • 对矩阵行化简操作几何含义的理解
  • HDI是什么?与普通线路板有何区别?优势在哪?
  • 嵌入式git分支管理策略
  • Java基础第9天总结(可变参数、Collections、斗地主)
  • 魔域服务器多少钱一个月?魔域服务器配置要求及推荐
  • Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十四天
  • 鸿蒙Next开发指南:XComponent与Progress组件的深度解析与实践
  • 在 PySpark 中解锁窗口函数的力量,实现高级数据转换
  • 数控机床相邻轨迹最大过渡速度计算方法介绍
  • 【Kubernetes】知识点2
  • 【数学建模学习笔记】时间序列分析:LSTM
  • Vue 3 + TypeScript 现代前端开发最佳实践(2025版指南)
  • 【完整源码+数据集+部署教程】PHC桩实例分割系统源码和数据集:改进yolo11-Faster-EMA
  • 黄金金融期货数据API对接技术文档
  • nmap扫描端口,netstat
  • 土地退化相关
  • Axure: 平滑折线图
  • Apache Doris:重塑湖仓一体架构的高效计算引擎
  • 文件页的预取逻辑
  • 小兔鲜儿项目
  • 树莓派网页监控
  • 从 Arm Compiler 5 迁移到 Arm Compiler 6
  • 2025 随身 WIFI 行业报告:从拼参数到重体验,华为 / 格行 / 中兴技术差异化路径解析