静态工厂模式(简单工厂模式)与动态工厂模式(工厂方法模式)

devtools/2024/10/21 5:39:33/

1. 简单工厂模式

核心是定义一个创建对象的接口,将对象的创建和本身的业务逻辑分离,降低系统的耦合度,使得两个修改起来相对容易些,当以后实现改变时,只需要修改工厂类即可。该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象,其UML类图如下:

AbstractProduct

/** 产品接口 **/
public interface AbstractProduct {void doSomething();
}

Product1

public class ProductA implements AbstractProduct {@Overridepublic void doSomething() {System.out.println("i am productA");}
}

Product2 

public class ProductB implements AbstractProduct {@Overridepublic void doSomething() {System.out.println("i am productB");}
}

Factory 

/** 简单工厂 **/
public class SimpleFactory {public static AbstractProduct createProduct(String productName){AbstractProduct instance = null;switch (productName){case "A":instance = new ProductA();break;case "B":instance = new ProductB();break;}return instance;}
}

测试 

public class SimpleFactoryTest {public static void main(String[] args) {AbstractProduct productA = SimpleFactory.createProduct("A");productA.doSomething();AbstractProduct productB = SimpleFactory.createProduct("B");productB.doSomething();}
}

2. 工厂方法模式 

        和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,其UML类图如下:

AbstractProduct 

/** 产品接口 **/
public interface AbstractProduct {void doSomething();
}

Product1

/**  具体产品实现 **/
public class ProductA implements AbstractProduct {@Overridepublic void doSomething() {System.out.println("i am productA");}
}

Product2 

/**  具体产品实现 **/
public class ProductB implements AbstractProduct {@Overridepublic void doSomething() {System.out.println("i am productB");}
}

ConcreateFactory1 

/**  具体工厂实现 **/
public class FactoryA implements AbstractFactory {@Overridepublic AbstractProduct createProduct() {return new ProductA();}
}

ConcreateFactory2 

/**  具体工厂实现 **/
public class FactoryB implements AbstractFactory{@Overridepublic AbstractProduct createProduct() {return new ProductB();}
}

AbstractFactory 

/**  工厂接口 **/
public interface AbstractFactory {public AbstractProduct createProduct();
}

测试 

public class AbstractFactoryTest {public static void main(String[] args) {AbstractFactory factoryA = new FactoryA();AbstractProduct abstractProductA = factoryA.createProduct();abstractProductA.doSomething();AbstractFactory factoryB = new FactoryB();AbstractProduct abstractProductB = factoryB.createProduct();abstractProductB.doSomething();}
}


http://www.ppmy.cn/devtools/104196.html

相关文章

HarmonyOS开发实战( Beta5版)应用性能工具CPU Profiler的使用规范

简介 本文档介绍应用性能分析工具CPU Profiler的使用方法,该工具为开发者提供性能采样分析手段,可在不插桩情况下获取调用栈上各层函数的执行时间,并展示在时间轴上。 开发者可通过该工具查看TS/JS代码及NAPI代码执行过程中的时序及耗时情况…

HTML静态网页成品作业(HTML+CSS)——游戏战地介绍设计制作(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…

已知弧度和半径,如何确定两点之间的距离?

如果已知弧度(通常表示为 θ)和半径(表示为 r),可以使用以下几何关系来确定圆弧上的两点之间的实际线性距离。 圆弧的长度(即两点之间的距离)可以通过以下公式计算: 弧长rθ 其中&a…

Zoom iOS 转录例子

一、在zoom marketplace创建通用app,zoom-recall 详见Zoom会议机器人转写例子-CSDN博客 二、mac下按照Xcode,创建APP项目meetingbot4ios 三、本实用的SDK为MobileRTC,即Meeting SDK的iOS版本 四、依赖如下: MobileRTC和Crypto…

鸿蒙启动框架配置文件(StartUpTask)

{"startupTasks": [//有哪些任务{"name": "StartupTask_001",//任务名字"srcEntry": "./ets/startup/StartupTask_001.ets",//任务的文件路径"runOnThread": "taskpool",//运行在哪个现成,有…

为了支持XR,3GPP R18都做了哪些增强?

这篇是R18 XR enhancement的第二篇,主要看下从NAS->L3->L2->L1针对XR都做了哪些增强。 1 PDU set QoS 在UL和DL中,XR-Awareness有助于优化gNB无线资源调度,但是这里就依赖于 PDU set和data burst。这两个东西是什么意思?其实PDU set就是由一个或多个 PDU组成,这…

面试官让简述一下elasticsearch

当面试官要求你简述 Elasticsearch 时,你可以从以下几个方面来介绍: 1. 简介 Elasticsearch 是一个分布式的、RESTful 风格的搜索和分析引擎,基于 Lucene 构建。它能够处理海量数据,提供近乎实时的全文搜索功能,并且可以轻松扩展到数百台服务器及 PB 级结构化或非结构化…

Maven Wrapper深入实战

概述 官网,GitHub。 Maven Wrapper,缩写为mvnw,是一个受Gradle Wrapper和Takari Wrapper启发而产生的Maven子项目,主要有以下三个用途: 让开发者电脑上无需安装Maven,也不用配置环境变量,即可…