首页 > 其他分享 >软件设计模式与体系结构之简单工厂模式和工厂方法模式

软件设计模式与体系结构之简单工厂模式和工厂方法模式

时间:2024-01-04 12:04:26浏览次数:33  
标签:return 软件设计 double 模式 public result new 工厂 class

一、实验目的

  1. 掌握简单工厂模式和工厂方法模式的概念,能够灵活使用简单工厂模式和工厂方法模式解决相关问题。 二、实验内容 场景描述一: 在某OA系统中,系统根据对比用户在登录时输入的账号和密码以及在数据库中存储的账号和密码是否一致来进行身份验证,如果验证通过,则取出存储在数据库中的用户权限等级(以整数形式存储),根据不同的权限等级创建不同等级的用户对象,不同等级的用户对象拥有不同的操作权限。现使用简单工厂模式设计该系统。 三个等级对象:管理员、经理和员工。 变化权限:diff() 不变权限:same() 要求: 1、利用UML图给出相应的角色,并有相关描述; 2、给出程序代码,程序代码有恰当的注释; 3、文档格式正确,排版清晰。

1.对应的UML图如下图所示: image.png 程序代码如下:


Client 类

import java.util.Scanner;

public class Client {

    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入输入身份账号");
        String username=scanner.next();
        System.out.println("输入密码");
        String password=scanner.next();
        int count = 0;
        if(username.equals("Employee")&&password.equals("123")){
            count=1;
        }else if(username.equals("Manager")&&password.equals("123")){
            count=2;
        }else if(username.equals("Administrator")&&password.equals("123")){
            count=3;
        }else{
            throw new Exception("输入错误!");
        }
        try {
            UserFactory userFactory=new UserFactory();
            User user = userFactory.getUser(count);
            user.sameOperation();
            user.diffOperation();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

UserFactory 类
public class UserFactory {
    public User getUser(int permission) throws Exception {
        if (permission==1) {
            return new Employee();
        }else if (permission==2) {
            return new Manager();
        }else if (permission==3) {
            return new Administrator();
        }else {
            throw new Exception("输入错误");
        }
    }
}

User 类
public class User {
    public void sameOperation(){
        System.out.println("User sameOperation");
    }
    public void diffOperation(){
        System.out.println("User diffOperation");
    }
}

Employee 类
public class Employee extends User{
    public void diffOperation(){
        System.out.println("Employee sameOperation");
    }
}

Manager 类
public class Manager extends User{
    public void diffOperation(){
        System.out.println("Manager diffOperation");
    }
}
Administrator 类
public class Administrator extends User{
    public void diffOperation(){
        System.out.println("Administrator diffOperation");
    }
}

试运行: image.png

场景描述二: 某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等,且用户可以根据要求动态选择日志记录方式,现使用工厂方法模式设计该系统。 要求: 1、利用UML图给出相应的角色,并有相关描述; 2、给出程序代码,客户端不能使用具体工厂类的名称,要求使用配置文件+反射机制,程序代码有恰当的注释; 3、文档格式正确,排版清晰。 1.对应的UML图如下 图所示: image.png

程序代码如下:

Client 类:
public class Client {

    public static void main(String[] args) throws Exception {
        Object bean = XMLUtil.getBean();

        if(bean.getClass().getSimpleName().equals("FileLogFactory")){
            FileLogFactory fileLogFactor=(FileLogFactory)bean;
            Log log = fileLogFactor.createLog();
            log.writeLog();
        }else if(bean.getClass().getSimpleName().equals("DatabaseLogFactory")){
            DatabaseLogFactory databaseLogFactory =(DatabaseLogFactory) bean;
            Log log = databaseLogFactory.createLog();
            log.writeLog();
        }else {
            throw new Exception("xml文件错误");
        }
    }
}
FactoryMethodconfig.xml
<?xml version="1.0"?>
<config>
	<className>two.FileLogFactory</className>
</config>

XMLUtil类
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

public class XMLUtil
{
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
	public static Object getBean()
	{
		try
		{
			//创建文档对象
			DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = dFactory.newDocumentBuilder();
			Document doc;							
			doc = builder.parse(new File("homework-02/FactoryMethodconfig.xml"));
		
			//获取包含类名的文本节点
			NodeList nl = doc.getElementsByTagName("className");
            Node classNode=nl.item(0).getFirstChild();
            String cName=classNode.getNodeValue();
            
            //通过类名生成实例对象并将其返回
            Class c=Class.forName(cName);
	  	    Object obj=c.newInstance();
            return obj;
           }   
           	catch(Exception e)
           	{
           		e.printStackTrace();
           		return null;
           	}
		}
}

Log 接口:
public interface Log {
    public void writeLog();
}

LogFactory 接口:
public interface LogFactory {
    public Log createLog();
}

FileLogFactory 类:
public class FileLogFactory implements LogFactory{
    @Override
    public Log createLog() {
        return new FileLog();
    }
}
FileLog 类:
public class FileLog implements Log{

    @Override
    public void writeLog() {
        System.out.println("FileLog!");
    }
}
DatabaseLogFactory 类:
public class DatabaseLogFactory implements LogFactory{
    @Override
    public Log createLog() {
        return new DataBaseLog();
    }
}
DataBaseLog 类:
public class DataBaseLog implements Log{
    @Override
    public void writeLog() {
        System.out.println("writeLog!");
    }
}

场景描述三: 把实验1中的运算器用工厂方法模式实现。 要求: 1、画出UML类图; 2、给出程序代码,程序代码有恰当的注释; 3、文档格式正确,排版清晰。 1、UML类图如下: image.png

2、程序代码如下:

Client类:
import java.util.Scanner;
public class Client{
    public static void main(String[] args) {
        System.out.println("输入第一个操作数");
        Scanner scan = new Scanner(System.in);
        double num1 = scan.nextDouble();

        System.out.println("输入运算符");
        String operation = scan.next();

        System.out.println("输入第二个操作数");
        double num2 = scan.nextDouble();

        Operation oper=OperationFactory.getResult(operation);
        oper.setNum1(num1);
        oper.setNum2(num2);
        double result=oper.getResult();
        System.out.println(num1 + operation + num2 + "=" + result);
    }

}

Operation 类:
public class Operation {
    public double num1;
    public double num2;
    public double getNum1() {
        return num1;
    }
    public void setNum1(double num1) {
        this.num1 = num1;
    }
    public double getNum2() {
        return num2;
    }
    public void setNum2(double num2) {
        this.num2 = num2;
    }

    public  double getResult() {
        double result=0;
        return result;
    }
}

OperationFactory 类:
interface OperationFactory { // 工厂接口
    public static Operation getResult(String operator) {
        Operation oper=null;
        switch(operator) {
            case"+":
                oper=new AddOperation();
                break;
            case"-":
                oper=new SubOperation();
                break;
            case"*":
                oper=new ChengOperation();
                break;
            case"/":
                oper=new ChuOperation();
                break;
        }
        return oper;
    }
}

//加法类
public class AddOperation extends Operation{
    public double getResult() {
        double result=0;
        result=(num1+num2);
        return result;
    }
}

//减法类
public class SubOperation  extends Operation{
    public double getResult() {
        double result=0;
        result=(num1-num2);
        return result;
    }
}

//乘法类
public class ChengOperation extends Operation{
    public double getResult() {
        double result=0;
        result=(num1*num2);
        return result;
    }
}

//除法类
public class ChuOperation extends Operation{
    public double getResult() {
        double result=0;
        result=(num1/num2);
        return result;

    }
}

试运行: image.png 三、思考 请问工厂方法模式相比简单工厂模式有哪些优点? 简单工厂模式:任何”东西“的子类都可以被生产,负担太重。当所要生产产品种类非常多时,工厂方法的代码量可能会很庞大。工厂方法模式就很好的减轻了工厂类的负担,把某一类/某一种东西交由一个工厂生产。 在遵循开闭原则(对拓展开放,对修改关闭)的条件下,简单工厂对于增加新的产品,无能为力。因为增加新产品只能通过修改工厂方法来实现。工厂方法模式在同时增加某一类 ”东西“ 并不需要修改工厂类,只需要添加生产这类 ”东西“ 的工厂即可,使得工厂类符合开放-封闭原则。

标签:return,软件设计,double,模式,public,result,new,工厂,class
From: https://blog.51cto.com/histry/9098398

相关文章

  • 软件设计模式与体系结构之抽象工厂模式与建造者模式
    实验三:抽象工厂模式与建造者模式一、实验目的掌握抽象工厂模式和建造者模式的概念,能够灵活使用抽象工厂模式和建造者模式解决相关问题。二、实验内容场景描述一:某手机游戏软件公司欲推出一款新的游戏软件,该软件能够支持Symbian和Android等多个主流的手机操作系统平台,针对不同......
  • 命令模式,这么学就很简单!
    什么是命令模式?命令模式是一种行为型设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行、或者对操作进行记录和撤销。命令模式通过将请求的发送者(客户端)和接收者(执行请求的对象)解耦,提供了更大的灵活性和可维护性。听不懂......
  • 低代码开发:革新企业应用创新模式
    在当前信息化社会中,企业的运营管理和业务流程越来越依赖于各种应用程序。然而,传统的软件开发方式往往需要大量的专业技术人员和长时间的开发周期,这无疑给企业带来了很大的压力。因此,一种新型的软件开发方法——“低代码”应运而生。低代码是一种以图形化界面和配置为主导的应用程序......
  • 外观模式
    实验12:外观模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解外观模式的动机,掌握该模式的结构;2、能够利用外观模式解决实际问题。[实验任务]:计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(......
  • 【设计模式】单例模式——反序列化破坏单例模式的情景
    一个单例对象创建好之后,有时候需要将对象序列化然后进行数据持久化,下次使用的时候通过反序列化转化为内存对象。反序列化后的对象会重新分配内存,会破坏单例模式。首先看支持序列化的单例类的代码://实现Serializable即可实现序列化和反序列化publicclassSingletonimplementsSe......
  • 设计模式--单例模式
    设计模式是软件工程中共同的问题的解决方案,这些方案经过了验证和总结,能够在不同的情境中提供最佳的解决途径。设计模式主要分为三类:创建型模式、结构型模式和行为型模式。以下是这三类模式中的23个经典设计模式的列表:创建型模式(CreationalPatterns):创建型模式涉及对象的初始化和......
  • 厦门大学OpenHarmony技术俱乐部开创“1+N”新模式,加速推动产学研融合
    12月29日,OpenHarmony技术俱乐部再添重将——在多方见证下,厦门大学OpenHarmony技术俱乐部在翔安校区益海嘉里楼报告厅正式揭牌成立,现场出席领导及师生代表近千人。成立仪式现场OpenHarmony技术俱乐部携手厦门大学共绘开源生态新图景OpenHarmony是由开放原子开源基金会(OpenAtomFound......
  • Java设计模式-策略模式
    简介策略模式是指有一定行动内容的相对稳定的策略名称,策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法策略模式:定义了一组算法(业务规则)封装了每个算法这族的算法可互换代替组成抽象策略角色:策略类,通常由一个接口或者抽象类实现具体策略角......
  • 如何在 Ubuntu 20.04 上以独立模式设置 MinIO 对象存储服务器
    前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。如何在Ubuntu20.04上以独立模式设置MinIO对象存储服务器介绍存储非结构化对象数据blob并使其可通过HTTPAPI(称为对象存储)进行访问的能力是现代技术领域不可或......
  • 【设计模式】单例模式——clone()方法破坏单例模式的情景
    Java的对象不仅可以new关键字产生,也可以利用clone()方法产生,或者利用反射和反序列化产生。用DCL或静态内部类实现单例模式都是利用private修饰构造函数来解决new关键字产生多个对象的问题的,但单例模式仍然可以被clone()方法、反射和反序列化破坏。如下代码所示,让单例类实现Cloneabl......