Java使用设计模式中的工厂方法模式实例解析

Java使用设计模式中的工厂方法模式实例解析

什么是工厂方法模式

工厂方法模式是一种创建型设计模式。该模式使用工厂方法来解决对象创建的问题,即不直接使用new关键字来创建对象,而是通过工厂方法来创建。工厂方法是一个抽象方法,其返回类型为一个接口或抽象类,由不同的具体工厂来实现这个抽象方法,从而生产不同的产品。工厂方法模式可以增加新的产品类而不需要修改现有的代码。

工厂方法模式的组成

工厂方法模式由四个部分组成:抽象产品(Product)类,具体产品(ConcreteProduct)类,抽象工厂(Factory)类和具体工厂(ConcreteFactory)类。

  1. 抽象产品(Product)类

抽象产品类是一个抽象类或接口,由工厂方法创建的所有产品都必须实现它。

  1. 具体产品(ConcreteProduct)类

具体产品类是实现抽象产品接口的类。一般来说,一个工厂只会生产一个具体产品。

  1. 抽象工厂(Factory)类

抽象工厂类是一个抽象类或接口,它定义了工厂方法,用于创建不同的具体产品。

  1. 具体工厂(ConcreteFactory)类

具体工厂类实现了抽象工厂接口,它能够创建具体产品的实例。

工厂方法模式的优点和缺点

工厂方法模式的优点:

  1. 工厂方法模式可以将产品类的实例化过程和客户端代码解耦,从而降低了系统的耦合度。

  2. 工厂方法模式符合单一职责原则,每个具体工厂都负责创建一种产品,从而代码更加清晰简洁。

  3. 工厂方法模式扩展性良好,新的具体产品类只需要实现抽象产品类并由具体工厂类创建即可。

工厂方法模式的缺点:

  1. 工厂方法模式增加了系统的抽象性和理解难度。

  2. 工厂方法模式需要增加额外的代码来创建抽象产品类和工厂类。

工厂方法模式示例

以下是一个简单的工厂方法模式的示例:

抽象产品类

public interface Shape {
    void draw();
}

具体产品类

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("draw a circle");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("draw a rectangle");
    }
}

抽象工厂类

public interface ShapeFactory {
    Shape createShape();
}

具体工厂类

public class CircleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

public class RectangleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }
}

使用工厂方法模式创建对象

public static void main(String[] args) {
    ShapeFactory circleFactory = new CircleFactory();
    ShapeFactory rectangleFactory = new RectangleFactory();

    Shape circle = circleFactory.createShape();
    Shape rectangle = rectangleFactory.createShape();

    circle.draw();
    rectangle.draw();
}

运行结果:

draw a circle
draw a rectangle

该示例中,抽象产品类为Shape,具体产品类为CircleRectangle,抽象工厂类为ShapeFactory,具体工厂类为CircleFactoryRectangleFactory

我们通过在客户端代码中调用具体工厂的createShape()方法,即可创建不同的产品实例。

另外一个示例:

抽象产品类

public interface Animal {
    void eat();
}

具体产品类

public class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("Dog eats bone");
    }
}

public class Cat implements Animal {
    @Override
    public void eat() {
        System.out.println("Cat eats fish");
    }
}

抽象工厂类

public interface AnimalFactory {
    Animal createAnimal();
}

具体工厂类

public class DogFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Dog();
    }
}

public class CatFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Cat();
    }
}

使用工厂方法模式创建对象

public static void main(String[] args) {
    AnimalFactory dogFactory = new DogFactory();
    AnimalFactory catFactory = new CatFactory();

    Animal dog = dogFactory.createAnimal();
    Animal cat = catFactory.createAnimal();

    dog.eat();
    cat.eat();
}

运行结果:

Dog eats bone
Cat eats fish

该示例中,抽象产品类为Animal,具体产品类为DogCat,抽象工厂类为AnimalFactory,具体工厂类为DogFactoryCatFactory

我们通过在客户端代码中调用具体工厂的createAnimal()方法,即可创建不同的产品实例。

以上便是关于工厂方法模式的详细讲解和示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java使用设计模式中的工厂方法模式实例解析 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Mysql大小写敏感的问题

    MySQL大小写敏感的问题攻略 MySQL是一个常用的关系型数据库管理系统,它在处理大小写时有一些敏感性。本攻略将详细讲解MySQL大小写敏感的问题,并提供两个示例说明。 1. MySQL的大小写敏感性 MySQL在处理标识符(如表名、列名、变量名等)时,根据配置的不同,可能会对大小写敏感或不敏感。这取决于以下两个因素: 操作系统:在某些操作系统上,文件系统…

    other 2023年8月15日
    00
  • Maven jar包冲突的解决方案

    Maven jar包冲突的解决方案 在使用Maven构建项目时,可能会遇到不同版本的jar包冲突的问题。这些冲突可能导致编译错误或者运行时异常。下面是一些解决Maven jar包冲突的常用方法: 1. 排除冲突的依赖 可以通过在pom.xml文件中排除冲突的依赖来解决冲突问题。在需要排除依赖的依赖项中,使用<exclusions>标签指定要排除的…

    other 2023年10月16日
    00
  • 基于jQuery实现点击列表加载更多效果

    本文将为大家详细讲解如何基于jQuery实现点击列表加载更多的效果。本文所使用的技术均为jQuery,本文假设您已经对jQuery有一定的了解。 准备工作 在实现“点击列表加载更多”的效果之前,我们需要准备好以下两项: 1.数据 —— 用来展示列表的数据,可以是JSON格式的数据,也可以是从后台获取到的数据。2.HTML结构 —— 用于展示数据的HTML结构…

    other 2023年6月25日
    00
  • jQuery EasyUI基础教程之EasyUI常用组件(推荐)

    标题:jQuery EasyUI基础教程之EasyUI常用组件(推荐) 一、EasyUI常用组件介绍 EasyUI是一款基于jQuery的UI插件库,提供了很多易于使用的界面组件,可以快速地构建出美观、易用的Web界面。EasyUI包含许多常用的用户界面组件,包括弹窗、数据列表、表格、表单、菜单等。 二、EasyUI常用组件示例展示 1. 弹窗组件 弹窗组件…

    other 2023年6月26日
    00
  • DedeCms V5.6漏洞 变量未初始化 导致鸡助漏洞

    DedeCms V5.6是一款广泛使用的CMS系统,但该系统在变量未被正确初始化的情况下存在漏洞,攻击者可以通过利用该漏洞成功实施鸡助攻击。以下是攻击步骤: 攻击者首先需要获取DedeCms V5.6的登录页面,并且需要知道账号和密码才能登录系统; 然后攻击者需要构造恶意请求,通过向upload_picture.php文件中的path参数追加../路径,使得…

    other 2023年6月20日
    00
  • HTML5新特性 多线程(Worker SharedWorker)

    HTML5引入了多线程的概念,允许在单个页面中使用多个线程执行JavaScript代码。其中,Worker和SharedWorker是两种用于实现多线程编程的JavaScript API,它们可以在后台线程中执行JavaScript代码,而不会阻塞页面的渲染和交互。本教程就为大家详细介绍HTML5的多线程新特性及Worker和SharedWorker的使用方…

    other 2023年6月27日
    00
  • vue实现网页语言国际化切换

    实现网页语言国际化切换,通常需要实现多语言资源文件的管理和加载,以及在前端中根据用户选择的语言切换相应的资源内容。Vue.js 提供的 internationalization (i18n) 插件可以帮助我们快速实现这个功能。具体的实现步骤如下: 安装和配置插件 首先,需要安装 Vue.js 的国际化插件 vue-i18n。使用 npm 仓库,可以通过以下命…

    other 2023年6月27日
    00
  • linuxutc时间转换北京时间

    Linux系统中默认使用UTC时间,而北京时间是东八区时间,与UTC时间相差8个小时。因此,如果需要将UTC时间转换为北京时间,需要进行时区转换。以下是关于Linux时间转换为北京的详细攻略: 方法一:使用date命令 可以使用date命令将UTC时间转换为北京时间。以下是具体步骤: 查看当前UTC时间: bash date -u 输出结果类似于: Fri …

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部