课时89:工厂设计模式

简介: 课时89介绍工厂设计模式(Factory),涵盖接口的定义与使用、程序结构设计及工厂设计的核心概念。通过实例代码展示如何利用接口实现子类的向上转型,并通过工厂类解耦主类与子类的关系,从而实现更灵活和可扩展的设计。工厂模式使客户端无需关心具体子类的创建过程,仅需通过工厂类获取对象实例,简化了系统的维护和扩展。

课时89:工厂设计模式

摘要:本内容为工厂设计模式( Factory )的介绍

1. 接口的介绍

2. 程序的结构设计

3. 工厂设计

 

01.接口的介绍

 

1.1接口的基础信息

接口必须有子类,并且子类可以通过对象的向上转型来获取接口的实例化对象,在进行对象实例化的过程中存在设计问题。

 

1.2设计的影响

设计虽没有明确的标准,然而程序内的修改通常不影响其他部分,相对而言设计显得比较虚化,有许多成功的设计范例可供参考学习,应当深入分析其背后的目的。

举例:观察如下一个程序

Interface IFood {  //定义一个食物的标准
public viod eat(); //可以吃
}
class Bread implements IFood { //定义一种食物
public viod eat()  {//boolean比较麻烦换成viod
  System.out,println(“吃面包。”);
}
}
public class JavaDemo {
  public static viod main(String args[]){
    IFood food=new Bread();
    food.eat(); //吃面包
}
}

在本程序之中根据接口进行子类的定义,并且利用对象的向上转型进行接口对象实例化处理,程序执行后结果如下:

image.png

 

02.程序的结构设计

 

image.png

 

2.1主类、IFood、Bread之间的关系

在整个代码之中第一是主类(客户端),其后是IFood(食物),最后的实现位是Bread(面包)。在主类过程中必须明确的知道具体的子类,在其代码之中”IFood food=new Bread();“最为重要。


主类(客户端)需要明确的知道具体的子类(比如:现在面包吃腻了,需要牛奶,客户端就要做出修改),那么就发现整个代码,主类(客户端)最关注的是IFood(食物)本身,而非IFood(食物)的来历。对于客户端而言,无需知道子类的信息。


举例:扩展一类食物(强调客户端不关注IFood的来历,只关注IFood本身)

代码:

class Milk implements IFood { //Bread换成Milk
public viod eat()  {//boolean比较麻烦换成viod
  System.out,println(“喝牛奶。”);//上面改成牛奶,那么这里也要改成喝牛奶
}
}
public class JavaDemo {
  public static viod main(String args[]){
    IFood food=new Milk();//那么这里也要改
    food.eat(); //吃面包
}
}

 

2.2耦合的定义

所以此时的程序就表示出现有耦合的问题,而造成耦合最直接的原因:“关键字new”。换言之“关键字new”提供的只是最原始对象的实例化处理,也是造成整个开发代码耦合的关键原因。


以JVM的设计为例,Java实现可移植性的关键在于JVM,JVM的核心原理是:利用一个虚拟机来运行Java程序,所有的程序与具体的操作系统没有任何关联,而是由JVM进行匹配。结论:良好的设计应该避免耦合。


举例:工厂设计实现

class  Factory {
public static IFood geiInstance(String className){
  if (“bread”.equals(className)) {
    return new Bread();
}else if (“milk”.equals(className)){
    return new Milk();
}else{
    return null;
}
  }
}
public class JavaDemo {
  public static viod main(String args[]){
    IFood food= Factory .getInstance(args [0];//初始化参数
    food.eat(); //吃面包
}
}

代码执行结果如下:

image.png

得出结论:在本程序之中,客户端程序类与IFood接口的子类没有任何关联,所有的关联都是通过 Factory 类完成的,而在程序运行的时候可以通过初始化参数进行要使用的子类定义:

(1) Java JavaDemo bread

(2) Java JavaDemo milk

 

03.工厂设计

 

image.png

工厂设计的代码中,有两个不同的子类,主类与 Factory 有关,发现主类与子类无关,而整个程序代码中只需关注 Factory ,则 Factory 去关注子类,这样的设计叫工厂设计。如果子类需要进行扩充,只需要修改 Factory 程序类即可实现。

相关文章
|
11月前
|
设计模式 Java
设计模式之工厂
设计模式之工厂
|
1月前
|
设计模式
课时90:代理设计模式
课时90介绍了代理设计模式,该模式通过代理对象帮助用户专注于核心业务功能。代理模式中,客户端只关注核心业务(如“吃”),而代理对象负责准备、执行和清理工作。通过接口IEat、真实主题EatReal和服务代理EatProxy的实现,展示了如何在代码中应用代理模式。代理模式的特点是将业务逻辑与辅助操作分离,使代码更清晰且易于维护。
|
1月前
|
设计模式 Java
课时36:合成设计模式
引用应用分析三:合成设计模式。通过将电脑拆分为显示器、主机等组件,并进一步细分为主板、内存、CPU等,展示如何用类和对象组合构建复杂系统。每个模块独立,最终整合成完整的电脑结构,体现了Java中的合成设计模式。此模式强调模块化设计与引用传递,便于维护和扩展。
|
3月前
|
设计模式
「全网最细 + 实战源码案例」设计模式——模式扩展(配置工厂)
该设计通过配置文件和反射机制动态选择具体工厂,减少硬编码依赖,提升系统灵活性和扩展性。配置文件解耦、反射创建对象,新增产品族无需修改客户端代码。示例中,`CoffeeFactory`类加载配置文件并使用反射生成咖啡对象,客户端调用时只需指定名称即可获取对应产品实例。
106 40
|
1月前
|
设计模式 机器人
课时83:模板设计模式
课时83介绍了模板设计模式,重点讲解了抽象类的定义、实际应用及代码实现。抽象类作为加强型类,提供了更高层次的设计,用于统一管理子类行为。通过机器人、人类和猪三个实例,展示了如何利用抽象类实现不同对象的共性操作,如吃饭、睡觉和工作。代码范例中定义了抽象类`Action`及其子类`Robot`、`Person`和`Pig`,并通过命令模式实现了对这些行为的调用。抽象类的最大优势在于它能规范子类方法的实现,并提供普通方法调用抽象方法的能力,确保程序逻辑的一致性和灵活性。
|
5月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
80 2
|
8月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
120 1
|
8月前
|
设计模式 XML 数据格式
python之工厂设计模式
python之工厂设计模式
python之工厂设计模式
|
8月前
|
设计模式 测试技术
依赖注入与工厂设计模式的区别
【8月更文挑战第22天】
139 0
|
10月前
|
设计模式 Java 编译器
设计模式——创建型模式(工厂,简单工厂,单例,建造者,原型)
设计模式——创建型模式(工厂,简单工厂,单例,建造者,原型)

热门文章

最新文章

下一篇
oss创建bucket