首页 > 其他分享 >软件设计模式与体系结构之抽象工厂模式与建造者模式

软件设计模式与体系结构之抽象工厂模式与建造者模式

时间:2024-01-04 12:01:51浏览次数:42  
标签:return String 软件设计 void 模式 class model public 体系结构

实验三:抽象工厂模式与建造者模式 一、实验目的

  1. 掌握抽象工厂模式和建造者模式的概念,能够灵活使用抽象工厂模式和建造者模式解决相关问题。 二、实验内容 场景描述一: 某手机游戏软件公司欲推出一款新的游戏软件,该软件能够支持Symbian和Android等多个主流的手机操作系统平台,针对不同的手机操作系统,该游戏软件提供了不同的游戏操作控制类和游戏界面控制类,并提供相应的工厂类来封装这些类的初始化。软件要求具有较好的扩展性以支持新的操作系统平台,为了满足上述需求,采用抽象工厂模式进行设计。 要求: 1、画出UML图; 2、给出程序代码,程序代码有恰当的注释。 3、文档格式正确,排版清晰。 1、UML类图如下: image.png

2、程序代码如下:

AbstractFactory 接口 :
public interface AbstractFactory {
    public Controller produceController();
    public Play producePlay();
}

AndroidController 类:
public class AndroidController implements Controller{
    @Override
    public void controller() {
        System.out.println("Android Controller");
    }
}

AndroidFactory 类:
public class AndroidFactory extends AndroidController implements AbstractFactory{
    public Controller produceController(){
        return new AndroidController();
    }
    public Play producePlay(){
        return new AndroidPlay();
    }
}

AndroidPlay类:

public class AndroidPlay implements Play{
    @Override
    public void play() {
        System.out.println("Android Play");
    }
}

Controller接口:
public interface Controller {
    public void controller();
}

Play接口:
public interface Play {
    public void play();
}

SymbianController 类:
public class SymbianController implements Controller{
    @Override
    public void controller() {
        System.out.println("Symbian Controller");
    }
}

SymbianFactory类:
public class SymbianFactory implements AbstractFactory{
    public Controller produceController(){
        return new SymbianController();
    }
    public Play producePlay(){
        return new SymbianPlay();
    }
}

SymbianPlay 类:
public class SymbianPlay implements Play{
    @Override
    public void play() {
        System.out.println("Symbian Play");
    }
}

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-03/AbstractFactoryconfig.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;
           	}
		}
}

AbstractFactoryconfig.xml配置文件
<?xml version="1.0"?>
<config>
	<className>one.AndroidFactory</className>
</config>

Client类:
public class Client {
    public static void main(String[] args) {
        AbstractFactory factory=(AbstractFactory)XMLUtil.getBean();
        Controller controller=factory.produceController();
        controller.controller();
        Play play= factory.producePlay();
        play.play();
    }
}

运行效果图: image.png 3、回答问题:如果需要在上述设计方案中增加对Windows Mobile操作系统的支持,需对该设计方案进行哪些调整,简单说明实现过程。 场景描述二: 某软件公司欲开发一个音频和视频播放软件,为了给用户使用提供方便,该播放软件提供了多种界面显示模式,如完整模式、精简模式等。在不同的显示模式下主界面的组成元素有所差异,如在完整模式下将显示菜单、播放列表、主窗口、控制条等,在精简模式下只显示主窗口和控制条,现使用建造者模式设计该软件(要求用到钩子方法)。 1、画出UML图; 2、给出程序代码,程序代码有恰当的注释。 3、文档格式正确,排版清晰。 1、UML类图如下: image.png 2、程序代码如下:

Model类:
public class Model {
    private String meal;
    private String list;
    private String window;
    private String controller;

    public String getMeal() {
        return meal;
    }

    public void setMeal(String meal) {
        this.meal = meal;
    }

    public String getList() {
        return list;
    }

    public void setList(String list) {
        this.list = list;
    }

    public String getWindow() {
        return window;
    }

    public void setWindow(String window) {
        this.window = window;
    }

    public String getController() {
        return controller;
    }

    public void setController(String controller) {
        this.controller = controller;
    }
}

ModelBuilder 抽象类:
public abstract class ModelBuilder {
    protected Model model=new Model();
    public abstract void buildMeal();
    public abstract void buildList();
    public abstract void buildWindow();
    public abstract void buildController();
    public Model getModel()
    {
        return model;
    }
}

Player 类:
public class Player {
    private ModelBuilder mb;
    public void setModelBuilder(ModelBuilder mb){
        this.mb=mb;
    }
    public Model construct() {
        mb.buildMeal();
        mb.buildList();
        mb.buildWindow();
        mb.buildController();
        return mb.getModel();
    }
}

SubModelBuilderBig类:
public class SubModelBuilderBig extends ModelBuilder{
    @Override
    public void buildMeal() {
        model.setMeal("play meal");
    }

    @Override
    public void buildList() {
        model.setList("play list");
    }

    @Override
    public void buildWindow() {
        model.setWindow("play window");
    }

    @Override
    public void buildController() {
        model.setController("play controller");
    }
}

SubModelBuilderSmall类:
public class SubModelBuilderSmall extends ModelBuilder{
    @Override
    public void buildMeal() {
        model.setMeal("none");
    }

    @Override
    public void buildList() {
        model.setList("none");
    }

    @Override
    public void buildWindow() {
        model.setWindow("play window");
    }

    @Override
    public void buildController() {
        model.setController("play controller");
    }
}

XMLUtil类:
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
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-03/Builderconfig.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;
           	}
		}
}

Builderconfig.xml
<?xml version="1.0"?>
<config>
    <className>two.SubModelBuilderSmall</className>
</config>

Client 类:
public class Client {
    public static void main(String[] args) {
        ModelBuilder mb=(ModelBuilder)XMLUtil.getBean();
        Player player=new Player();
        player.setModelBuilder(mb);
        Model model=player.construct();
        System.out.println(model.getMeal());
        System.out.println(model.getList());
        System.out.println(model.getWindow());
        System.out.println(model.getController());
    }
}

运行效果图: image.png

标签:return,String,软件设计,void,模式,class,model,public,体系结构
From: https://blog.51cto.com/histry/9098454

相关文章

  • 命令模式,这么学就很简单!
    什么是命令模式?命令模式是一种行为型设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行、或者对操作进行记录和撤销。命令模式通过将请求的发送者(客户端)和接收者(执行请求的对象)解耦,提供了更大的灵活性和可维护性。听不懂......
  • 低代码开发:革新企业应用创新模式
    在当前信息化社会中,企业的运营管理和业务流程越来越依赖于各种应用程序。然而,传统的软件开发方式往往需要大量的专业技术人员和长时间的开发周期,这无疑给企业带来了很大的压力。因此,一种新型的软件开发方法——“低代码”应运而生。低代码是一种以图形化界面和配置为主导的应用程序......
  • 外观模式
    实验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......
  • 一款降压型开关模式转换器解决方案
    一、基本概述TX4145是一款降压型开关模式转换器。TX4145在6-60V宽输入电源范围内实现不同峰值输出电流,并且具有出色的线电压和负载调整率。TX4145采用PWM电流模工作模式,环路易于稳定并提供快速的瞬态响应。TX4145外部提供FS脚,可通过外接一个电阻设置工作频率。TX4145集成......