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日

相关文章

  • 小米手机如何给桌面的应用程序加密?

    针对“小米手机如何给桌面的应用程序加密”这个问题,我为您提供以下攻略: 1. 手动加密桌面应用程序 步骤如下: 长按桌面上需要加密的应用程序图标,选择“移动”,将应用移动到主屏幕下方的“更多应用”文件夹中。 进入“设置”应用,在“设置”中点击“应用锁”,并开启应用锁功能。 进入“应用锁”功能界面,在应用列表中选择您需要加密的应用,然后点击加锁按钮,即可完成加…

    other 2023年6月25日
    00
  • centos7云主机系统下挂载磁盘的方法

    下面我将为你详细讲解CentOS7云主机系统下挂载磁盘的方法。 步骤一:查看磁盘列表 首先,我们需要查看当前系统中的磁盘列表,用fdisk -l命令可以列出所有磁盘的信息,包括未挂载的磁盘。 sudo fdisk -l 步骤二:创建分区表和分区 接下来,我们需要对要挂载的磁盘进行分区。我们可以使用fdisk命令来创建分区表和分区。 sudo fdisk /d…

    other 2023年6月27日
    00
  • select改变事件

    当然,我可以为您提供有关“select改变事件”的完整攻略,以下是详细说明: 什么是select改变事件? select改变事件是指当用户在HTML中选择下拉列表中的选项时,会触一个事件。个事件可以用JavaScript来捕获和处理,以便在用户选择不同选项执行不同的操作。 select改变事件的使用 以下是使用select改变事件的步骤: 步骤1:创建下拉列…

    other 2023年5月7日
    00
  • PHP对象实例化单例方法

    PHP对象实例化单例方法是一种常用的设计模式,其主要目的是确保类在整个运行时期内最多只能有一个实例,并且提供一种全局可访问该实例的方式。下面我将为您详细讲解如何实现PHP对象实例化单例方法。 第一步:私有化构造函数和克隆函数 为了保证只有一个实例,我们需要将构造函数设为私有,防止外部通过new操作符创建新的实例。同时,我们还需要将克隆函数设为私有,防止通过c…

    other 2023年6月26日
    00
  • iOS12降级提示未能更新iPhone,发生未知错误(1667)的解决方法

    iOS12降级提示未能更新iPhone,发生未知错误 (1667) 的解决方法 如果你正在尝试降级到 iOS 12,并且在更新过程中遇到错误代码 1667,则说明升降级过程中出现了一些问题。这里提供了一些可行的解决方法来帮助您解决问题。 解决方法一:更新 iTunes 首先,您需要确保您正在使用最新版本的 iTunes 软件。例如,如果您使用的是旧版 iTu…

    other 2023年6月27日
    00
  • 超详细的Android开发调试工具ADB命令及安装介绍

    超详细的Android开发调试工具ADB命令及安装介绍 什么是ADB Android Debug Bridge(简称ADB)是一个调试工具,它可以通过USB或TCP/IP连接Android设备,让开发者可以在开发及调试移动应用时与设备进行通信,进行文件传输、安装应用、调试应用等操作。 ADB命令的安装 ADB是一个Android SDK的组件,因此,要安装A…

    other 2023年6月26日
    00
  • Android 画一个太极图实例代码

    下面我将为你详细讲解如何在Android上画一个太极图的完整攻略,包括示例说明。 1. 准备工作 在开始画太极图之前,先确保你已经在Android Studio中创建了一个项目,并且可以正常运行。 接下来,在项目的res/drawable文件夹下创建一个名为taichi.xml的文件,用于定义太极图的样式。 2. 定义太极图样式 在taichi.xml中加入…

    other 2023年6月20日
    00
  • 6.(转载)SSRF漏洞挖掘经验

    6. (转载) SSRF漏洞挖掘经验 本文将分享一些SSRF漏洞挖掘的经验和技巧。SSRF漏洞是一种在Web应用中广泛存在的安全漏洞,攻击者可以利用它来发起内网扫描、攻击内部系统等。 什么是SSRF漏洞? SSRF全称Server-Side Request Forgery(服务端请求伪造)漏洞,简单来说,就是Web应用程序中的一个安全漏洞,攻击者可以利用它来…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部