首页 > 其他分享 >设计模式——抽象工厂实验

设计模式——抽象工厂实验

时间:2024-03-15 17:23:59浏览次数:24  
标签:Payment public 订单 api 实验 import 抽象 设计模式 Order

抽象工厂实验

实验场景:电子商务系统中创建的订单分为国内订单(Domestic Order)和海外订单 (Overseas Order);国内订单使用人民币支付(RMB Payment),海外订单使用 美元支付(USD Payment)。

实验要求: 设计使用抽象工厂模式来实现订单创建功能。

实验内容:

  • 将订单工厂中的接口封装为 order-api.jar 模块,得到订单框架。
  • 实现订单框架中的接口,并将实现类封装为 order-impl.jar 模块。
  • 开发应用程序,使用订单框架完成订单创建功能。
  • 换一种方法实现订单框架中的接口,并将实现类封装为 other-impl.jar 模块。
  • 重新运行应用程序,将订单框架的实现切换为 other-impl.jar 模块。
  • 观察对应用程序 的影响,并思考解决方案。 提示:使用 Java SPI(Service Provider Interface)或依赖注入框架

实验理解:

抽象接:口有OrderFactory、Payment、Order。

​ OrderFactory接口需要被实现成国内国外两种对象。因此在接口中只需要定义工厂要干的事情,即创建自己的订单(order)和支付(payment)。

​ Payment接口只需要定义 支付需要用到的方法,国内工厂外实现这些方法的时候仅需根据自身情况,来实现独特的方法,这样便轻松区分开了国内外支付的代码。

​ Order接口也只需要定义订单相关的方法即可。

实现类:

​ DomesticOrderFactory实现了OrderFactory,它主要是创建国内的订单和对象。

​ DomesticOrder实现Order,用来实现接口中的方法,应为具体实现是按照国内情况实现的,因此它就属于国内的订单。

​ RMBPayment实现Payment,用来实现接口中的方法,应为具体实现是按照国内情况实现的,因此它就属于国内的支付。

​ 国外类似。

实验代码(放在一个项目中的情况,仅用来理解。实际需要打包成jar包来调用)

Order_api

order.java

package Order_api;

/**
 * 这里可以写订单相关的接口
 * 写的是国内外都能用到的接口,是一个并集
 */
public interface Order {
    public void placeOrder();
}

OrderFactory.java

package Order_api;

public interface OrderFactory {
    public Order createOrder();//创建订单接口
    public Payment createPayment();//创建支付接口
}

Payment.java

package Order_api;
/**
 *这里面就可以写支付相关的方法(接口)
 * 国内外都能用到的,是他们的并集
 */
public interface Payment {
    public void pay(double money);
}

Order_impl

DomesticOrder.java

package Order_impl;

import Order_api.Order;

/**
 * 用来实现国内订单
 * 实现具体的操作代码
 * 因为国内外的订单操作逻辑可能区别比较大,因此将其分开实现。
 */
public class DomesticOrder implements Order {
    @Override
    public void placeOrder() {
        System.out.println("欢迎创建国内订单!");
    }
}

DomesticOrderFactory.java

package Order_impl;

import Order_api.Order;
import Order_api.OrderFactory;
import Order_api.Payment;

/**
 * 国内工厂:它应该有两个类,属于国内的订单,属于国内的支付
 */
public class DomesticOrderFactory implements OrderFactory {
    /**
     * 用来创建国内工厂的订单类
     * @return DomesticOrder类(国内订单类)
     */
    @Override
    public Order createOrder() {
        return new DomesticOrder();
    }

    /**
     * 创建国内工厂的支付类
     * @return RMBPayment类
     */
    @Override
    public Payment createPayment() {
        return new RMBPayment();
    }
}

OverseasOrder.java

package Order_impl;

import Order_api.Order;

/**
 * 用来实现国外订单
 * 实现具体的操作代码
 * 因为国内外的订单操作逻辑可能区别比较大,因此将其分开实现。
 */
public class OverseasOrder implements Order {
    @Override
    public void placeOrder() {
        System.out.println("欢迎创建海外订单!");
    }
}

OverseasOrderFactory.java

package Order_impl;

import Order_api.Order;
import Order_api.OrderFactory;
import Order_api.Payment;

/**
 * 国外工厂:它应该有两个类,属于国外的订单,属于国外的支付
 */
public class OverseasOrderFactory implements OrderFactory {
    /**
     * 用来创建国外工厂的订单类
     * @return OverseasOrder类(国内订单类)
     */
    @Override
    public Order createOrder() {
        return new OverseasOrder();
    }
    /**
     * 创建国外工厂的支付类
     * @return USDPayment类
     */
    @Override
    public Payment createPayment() {
        return new USDPayment();
    }
}

RMBPayment.java

package Order_impl;

import Order_api.Payment;
/**
 * 这里面来实现 属于国内的接口。
 * 国外可能有同样的接口,但是他们实现的具体代码可能不同。
 * 因此将国内国外的实现分离开来。
 */
public class RMBPayment implements Payment {
    @Override
    public void pay(double money) {
        System.out.println("欢迎光临:请您支付"+money+"人民币");
    }
}

USDPayment.java

package Order_impl;

import Order_api.Payment;

/**
 * 这里面来实现 属于国外的接口。
 * 国内可能有同样的接口,但是他们实现的具体代码可能不同。
 * 因此将国内国外的实现分离开来。
 */
public class USDPayment implements Payment {

    @Override
    public void pay(double money) {
        System.out.println("欢迎光临:请您支付"+money+"美元");
    }
}

Application

应为演示是在一个项目中,所有包的位置并不严格准确

User_1.java

package Order_user;

import Order_api.Order;
import Order_api.OrderFactory;
import Order_api.Payment;
import Order_impl.DomesticOrderFactory;
import Order_impl.OverseasOrderFactory;

public class User_1 {
    public static void main(String[] args) {
        /**
         * 国内工厂的运行实例
         */
        OrderFactory Factory = new DomesticOrderFactory();
        Order domesticOrder = Factory.createOrder();
        Payment domestcPayment = Factory.createPayment();
        domesticOrder.placeOrder();
        domestcPayment.pay(14.39);

        /**
         * 国外工厂的运行实例
         */
        Factory = new OverseasOrderFactory();
        Order overseasOrder = Factory.createOrder();
        Payment overseasPayment = Factory.createPayment();
        overseasOrder.placeOrder();
        overseasPayment.pay(2.00);
    }
}

输出结果为:

欢迎创建国内订单!
欢迎光临:请您支付14.39人民币
欢迎创建海外订单!
欢迎光临:请您支付2.0美元

Java文件打包成jar包

方法①

进入java文件(带.java)的目录终端下面,执行以下指令:

javac Order.java

就可以将其编译成.class文件

都编译完后执行:

jar -cvf tools.jar *

将其打包成jar包

方法②

也可使用IDEA来打Jar包。

File -> Project Sructure -> Artifacts -> 

From modules with dependencies... -> 。。。

通过导入jar包运行成功截图

标签:Payment,public,订单,api,实验,import,抽象,设计模式,Order
From: https://www.cnblogs.com/Hygge1024/p/18075863

相关文章

  • 实验1 C语言输入输出和简单程序编写
    task1_1.c1#include<stdio.h>2intmain()3{4printf("O\n");5printf("<H>\n");6printf("II\n");7printf("O\n");8printf("<H>\n");9prin......
  • C语言中抽象函数与具体实现的命名与组织
    C语言中抽象函数与具体实现的命名与组织在C语言的项目开发中,尤其是嵌入式系统和开源软件项目里,合理地命名和组织抽象函数及其具体实现对于提高代码的可读性、可维护性和可扩展性至关重要。以下是关于如何在这些项目中有效地处理抽象和实现的一些建议:抽象函数与具体实现的区分A......
  • 【数据挖掘】实验2:R入门2
    实验2:R入门2一:实验目的与要求1:熟悉和掌握R数据类型。2:熟悉和掌握R语言的数据读写。二:实验内容1:R数据类型【基本赋值】Eg.1代码:x<-8x Eg.2代码:a='city'a【缺省值】Eg.1代码:(1)生成向量z;(2)返回z的结果;(3)识别z的值是否有缺失值。z<-c(1:5,NA)zis.na(......
  • 【数据挖掘】实验1:R入门(内含详细R和RStudio安装教程)
    实验1:R入门一:实验目的与要求1:根据上课PPT内容,掌握课堂知识并进行代码练习操作,提供练习过程和结果。2:可COPY代码运行结果直接提交,如涉及到输出图等可截图。二:实验内容1:R语言的下载与安装1.1:安装R语言从清华镜像网站(TheComprehensiveRArchiveNetwork)处下载Windows版......
  • Linux 基本权限管理及实验
    一、权限介绍在linux的世界里,一切皆文件,当我们对一个文件长格式显示时,会出现很多具体的信息,这里我以创建的一个临时文件为例: 从左往右的信息分别表示为:(1)-rwxr-xr-x.  :文件的权限(2)1 :文件link数或者是目录中子目录的数量(在这里展示的是文件信息)(3)root :所属用户(4)r......
  • 实验一c语言输入输出和简单程序应用编程
    1#include<stdio.h>2intmain()3{456printf("o\n");7printf("<H>\n");8printf("II\n");9printf("o\n");10printf("<H>\n");11......
  • 【Java面试题-基础知识02】Java抽象类和接口六连问?
    1、抽象类和接口分别是什么?抽象类是一种类,可以包含抽象方法和非抽象方法,抽象方法是没有具体实现的方法,需要在子类中被具体实现。接口是一种完全抽象的类,其中的所有方法都是抽象方法,没有方法体,它只是定义了一组方法的契约。2、接口中一定不可以有实现方法吗?不一定,Java8引入......
  • 4.static应用-单例设计模式
    什么是设计模式,设计模式主要学什么,单例模式解决了什么问题?设计模式就是具体问题的最有解决方案解决了什么问题?怎么写?确保一个类只有一个对象单例怎么写,饿汉式单例的特点是什么?把类的构造器私有;定义一个类变量存储类的一个对象;提供一个类方法返回对象在获取类的对象时,对......
  • 什么是服务器端广告插入(server side ad insertion - SSAI)- 为什么说采用IAB技术实验室
    服务器端广告插入(SSAI-serversideadinsertion)是在联网(有线)电视上广告竞标行动中的最流行的技术解决方案之一。SSAI是一种在视频流加载到用户设备之前将广告植入在一起的技术。它可以用于任何连接或超顶级(overthetop-OTT)视频环境,包括社交环境,但大部分需求来自CTV的爆......
  • 网络对抗 实验一 逆向及Bof基础实践说明
    《网络对抗》-逆向及Bof基础实践实验目标本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的......