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

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.dtcms.com/a/363758.html

相关文章:

  • 金博智慧:数量感知与注意力对儿童数学成绩的影响
  • OpenTiny NEXT 训练营实操体验 | 四步将你的 Web 应用升级为智能应用
  • Unity通过Object学习原型模式
  • 第三家公司虽然用了powerbi,但更适合用excel
  • QuickBI的已选字段 vs PowerBI的字段参数
  • 语音机器人交互系统:核心技术与应用挑战
  • 互联网向无线通信发展的关键历史时期
  • C语言风格字符串:概念、问题与解决方案
  • 技术干货|性能监控基石Prometheus(普罗米修斯)核心组件
  • MySQL进阶知识梳理
  • GEM5学习(2):运行x86Demo示例
  • 【数学建模学习笔记】时间序列分析:ARIMA
  • 3D语义地图(3D Semantic Mapping)研究现状
  • 如何使用Kafka处理高吞吐量的实时数据
  • 初识NOSQL
  • C++算法学习:位运算
  • 基础思想:动态规划与贪心算法
  • 解决由Tomcat部署前端改成nginx部署,导致大写.JPG结尾文件无法访问问题
  • 火语言 RPA 界面应用生成:轻量化开发核心优势
  • 51单片机(单片机基础,LED,数码管)
  • 电脑配置不足怎么办,告别硬件束缚,川翔云电脑
  • kaggle中的2D目标检测训练trick总结
  • OCR 识别准确率的关键影响因素
  • 【嵌入式电机控制#进阶7】V/F强拖启动
  • Windows 11系统终极优化指南
  • 亚马逊的领导力原则
  • UCIE Specification详解(十四)
  • 【LeetCode 热题 100】1143. 最长公共子序列——(解法二)递推
  • 快速入门Vue3——基础语法
  • Linux文本处理工具