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

FactoryMethod工厂方法模式详解

目录

  • 模式定义
  • 实现方式
    • 简单工厂
    • 工厂方法
    • 主要优点
  • 应用场景
  • 源码中的应用

模式定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。
Factory Method 使得一个类的实例化延迟到子类。
在这里插入图片描述

实现方式

简单工厂

以下示例非设计模式,仅为编码的一种规范

public class FactoryMethod {public static void main(String[] args) {Application application = new Application();Product product = application.getObject("0");product.method1();}
}interface Product{void method1();
}class ProductA implements Product{public void method1(){System.out.println("ProductA.method1 executed.");}
}class ProductB implements Product{public void method1(){System.out.println("ProductB.method1 executed.");}
}class SimpleFactory{public static Product createProduct(String type){if ("0".equals(type)){return new ProductA();}else if ("1".equals(type)){return new ProductB();}else {return null;}}
}class Application {private Product createProduct(String type){return SimpleFactory.createProduct(type);}Product getObject(String type){Product product = createProduct(type);return product;}
}

工厂方法

public class FactoryMethod {public static void main(String[] args) {Application application = new ConcreteProductA();Product product = application.getObject();product.method1();}
}interface Product{void method1();
}class ProductA implements Product{public void method1(){System.out.println("ProductA.method1 executed.");}
}class ProductB implements Product{public void method1(){System.out.println("ProductB.method1 executed.");}
}class SimpleFactory{public static Product createProduct(String type){if ("0".equals(type)){return new ProductA();}else if ("1".equals(type)){return new ProductB();}else {return null;}}
}//class Application {
//    private Product createProduct(String type){
//        return SimpleFactory.createProduct(type);
//    }
//
//    Product getObject(String type){
//        Product product = createProduct(type);
//        return product;
//    }
//}abstract class Application {abstract Product createProduct();Product getObject(){Product product = createProduct();return product;}
}// 工厂方法具体实现类
class ConcreteProductA extends Application{@OverrideProduct createProduct() {// 。。。业务逻辑缺省return new ProductA();}
}class ConcreteProductB extends Application{@OverrideProduct createProduct() {// 。。。业务逻辑缺省return new ProductB();}
}

主要优点

  1. 将具体产品和创建者解耦
  2. 符合单一职责原则
  3. 符合开放封闭原则

应用场景

  1. 抽象:当你不知道该使用对象的确切类型的时候。
  2. 扩展:当你希望为库或框架提供扩展其内部组件的方法时。

源码中的应用

// java api
// 静态工厂方法

Calendar.getInstance()
java.text.NumberFormat.getInstance()
java.util.ResourceBundle.getBundle()

// 工厂方法

java.net.URLStreamHandlerFactory
javax.xml.bind.JAXBContext.createMarshaller

创作不易,点赞、关注、收藏
创作不易,点赞、关注、收藏
创作不易,点赞、关注、收藏
请添加图片描述

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

相关文章:

  • Java基础-知识点1(面试|学习)
  • 【InternLM 实战营第二期-笔记1】书生浦语大模型开源体系详细介绍InternLM2技术报告解读(附相关论文)
  • 【免费】基于SOE算法的多时段随机配电网重构方法
  • Swift面向对象编程
  • IEDA 的各种常用插件汇总
  • 浅谈C语言中异或运算符的10种妙用
  • Canal--->准备MySql主数据库---->安装canal
  • vs配置opencv运行时“发生生成错误,是否继续并运行上次的成功生成”BUG解决办法
  • Dryad Girl Fawnia
  • 内存相关知识(新)
  • C++从入门到精通——static成员
  • 【K8S:初始化】:执行kubeadm显示:connection refused.
  • msvcp140_1.dll是什么?找不到msvcp140_1.dll丢失解决方法
  • 【Java探索之旅】掌握数组操作,轻松应对编程挑战
  • 深入理解同步与异步编程及协程管理在Python中的应用
  • Win10本地更新无法升级win11 的0x80080005解决方法
  • 互联网轻量级框架整合之MyBatis核心组件
  • springboot websocket 持续打印 pod 日志
  • C代码编译过程与进程内存分布
  • Windows 部署ChatGLM3大语言模型
  • JS相关八股之什么是事件循环
  • SpringCloud集成Skywalking链路追踪和日志收集
  • HTTP 域名和主机是一回事吗?有了主机和域名,如何建站?
  • 运营干货:四个技巧掌握爆款选题方法
  • 柯桥商务口语之怎么样说英语更加礼貌?十个礼貌用语get起来!
  • 嵌入式工程师如何摸鱼?
  • C++语言题库(一)—— 基本知识类
  • gemini1.5 API调用
  • C++从入门到精通——const与取地址重载
  • 手写spring IOC底层源码来模拟spring如何利用多级缓存解决循环依赖的问题