2023年秋季《软件设计模式》实验二:创建型设计模式实验

实验内容

一、 使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数“M”,则返回一个Man对象,如果传入参数“W”,则返回一个Woman对象。现需要增加一个新的Robot类,如果传入参数“R”,则返回一个Robot对象,对代码进行修改并注意“女娲”的变化。绘制类图并编程模拟实现。

需提供简单工厂模式实例的结构图(类图)和模拟实现代码。

添加Robot类之前类图:

1.Person接口:

public interface Person {
    public void create();
}

2.Man类

public class Man implements Person{

    @Override
    public void create() {
        System.out.println("制造男人!");
    }
}

3.Woman类

public class Woman implements Person{

    @Override
    public void create() {
        System.out.println("制造女人!");
    }
}

4.NvwaFactory类

public class NvwaFactory {
    public static Person createPerson(String people){
        Person person=null;
        if(people.equalsIgnoreCase("M")) {
            person = new Man();
            System.out.println("初始化男人对象!");
        }
        else {
            person=new Woman();
            System.out.println("初始化女人对象!");
        }
         return person;
    }
}

5.Client类

public class Client {
    public static void main(String args[]){
        Person person;
        person=NvwaFactory.createPerson("W");
        person.create();
    }
}

添加Robot类之后:

测试代码要添加Robot类,NvwaFactory有变化,其余的类同上。

6.Robot类

public class Robot implements Person{

    @Override
    public void create() {
        System.out.println("制造机器人!");
    }
}

7.NvwaFactory类(添加Robot类之后)

public class NvwaFactory {
    public static Person createPerson(String people){
        Person person=null;
        if(people.equalsIgnoreCase("M")) {
            person = new Man();
            System.out.println("初始化男人对象!");
        }
        else if (people.equalsIgnoreCase("W")){
            person=new Woman();
            System.out.println("初始化女人对象!");
        }
        else{
            person=new Robot();
            System.out.println("初始化机器人对象");
        }
         return person;
    }
}

8.测试图

二、使用简单工厂模式设计一个可以创建不同几何形状(Shape),例如圆形(Circle)、矩形(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制方法draw()和擦除方法erase(),要求在绘制不支持的几何图形时,抛出一个UnsupportedShapeException异常,绘制类图并编程模拟实现。

需提供简单工厂模式实例的结构图(类图)和模拟实现代码。【本题要求使用配置文件来存储参数】

1.Shape接口

public interface Shape {
    public void draw();
    public void erase();
}

2.Circle类

public class Circle implements Shape{
    public void draw(){
        System.out.println("draw circle!");
    }
    public void erase(){
        System.out.println("erase circle!");
    }
}

 3.Rectangle类

public class Rectangle implements Shape{
    public void draw(){
        System.out.println("draw rectangle!");
    }
    public void erase(){
        System.out.println("erase rectangle!");
    }
}

 4.Triangle类

public class Triangle implements Shape{
    public void draw(){
        System.out.println("draw triangle!");
    }
    public void erase(){
        System.out.println("erase triangle!");
    }
}

5.ShapeFactory类

public class ShapeFactory {
    public static Shape createShape(String type) throws UnsupportedShapeException {
        Shape shape=null;
        if (type.equalsIgnoreCase("circle")){
            shape=new Circle();
            System.out.println(" 初始化 Circle!");
        }
        else if (type.equalsIgnoreCase("rectangle")){
            shape=new Rectangle();
            System.out.println(" 初始化 Rectangle!");
        }
        else if(type.equalsIgnoreCase("Triangle")){
            shape=new Triangle();
            System.out.println(" 初始化 Triangle!");
        }
        else{
            throw new UnsupportedShapeException();
        }
        return shape;
    }
}

 6.UnsupportedShapeException类

public class UnsupportedShapeException extends Exception{
        public String toString(){
            return "no existence!";
        }
}

7.Client类

public class Client {
    public static void main(String[] args){
        String type = XMLUtil.getShapeType(); //读取配置文件中的参数
        Shape shape = null;
        try {
            shape = ShapeFactory.createShape(type);//创建产品对象
            shape.draw();
            shape.erase();
        }catch (UnsupportedShapeException e){
            System.out.println(e.toString());
        }
    }
}

8.配置文件

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 String getShapeType() {
        try {
            //创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("E:\\software_partern\\code_all\\designpattern_experiment\\src\\Shape1\\shape.xml"));

            //获取包含图表类型的文本结点
            NodeList nl = doc.getElementsByTagName("shapeType");
            Node classNode = nl.item(0).getFirstChild();
            String shapeType = classNode.getNodeValue().trim();
            return shapeType;
        }
        catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

9.XML文件

<?xml version="1.0"?>

<config>

    <shapeType>circle</shapeType>

</config>

10.测试图

三、 在某网络管理软件中,需要为不同的网络协议提供不同的连接类,例如针对POP3协议的连接类POP3Connection、针对IMAP协议的连接类IMAPConnection、针对HTTP协议的连接类HTTPConnection等。由于网络连接对象的创建过程较为复杂,需要将其创建过程封装到专门的类中,该软件还将支持更多类型的网络协议。

现采用工厂方法模式进行设计,绘制类图并编程模拟实现。需提供工厂方法模式实例的结构图(类图)和模拟实现代码。【本题要求使用配置文件和反射机制实现】

1、ConnectionFactory接口

public interface ConnenctionFactory {
     Connection createConnection();
}

2、Connection接口

public interface Connection {
    public void setConnection();
}

3、HTTPConnection类

public class HTTPConnection implements Connection{
    @Override
    public void setConnection() {
        System.out.println("成功创建HTTP连接!");
    }
}

4、HTTPFactory类

public class HTTPFactory implements ConnenctionFactory{

    @Override
    public Connection createConnection() {
        Connection connection=new HTTPConnection();
        System.out.println("创建HTTP连接!");
        return connection;
    }
}

5、 IMAPConnection类

public class IMAPConnection implements Connection{

    @Override
    public void setConnection() {
        System.out.println("成功创建IMAP连接!");
    }
}

6、IMAPFactory类

public class IMAPFactory implements ConnenctionFactory{

    @Override
    public Connection createConnection() {
        Connection connection=new IMAPConnection();
        System.out.println("创建IMAP连接!");
        return connection;
    }
}

7、POP3Connection类

public class POP3Connection implements Connection {
    @Override
    public void setConnection() {
        System.out.println("成功创建POP3连接!");
    }
}

8、POP3Factory类

public class POP3Factory implements ConnenctionFactory{

    @Override
    public Connection createConnection() {
        Connection connection = new POP3Connection();
        System.out.println("创建POP3连接!");
        return connection;
    }
}

9、Client类

public class Client {
    public static void main(String[] args) {
        ConnenctionFactory connenctionFactory;
        Connection connection;
        connenctionFactory=(ConnenctionFactory)XMLUtil.getBean();
        connection=connenctionFactory.createConnection();
        connection.setConnection();
    }
}

10、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 {
    public static Object getBean(){
        try {
            //创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("E:\\software_partern\\code_all\\designpattern_experiment\\src\\Protocol\\conn.xml"));//此处文件为xml文件的路径
            NodeList nl = doc.getElementsByTagName("connection");
            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;
        }
    }
}

11、xml配置文件

<?xml version="1.0" ?>

<config>

    <connection>Protocol.HTTPFactory</connection>

</config>

 

四、 在某FPS(First-Person Shooting Game,第一人称射击) 游戏中提供了多个不同的游戏场景。在每一个游戏场景中,提供了对应的地图(Map)、天气(Weather)和游戏背景音乐(Sound)等。

使用抽象工厂模式设计该系统,使得当用户选择游戏场景时,该场景所对应的地图、天气和背景音乐能够同时出现;此外,还可以方便地在该游戏中增加新的游戏场景。绘制类图并编程模拟实现。

1、SceneFactory接口

public interface SceneFactory {
    Map createMap();
    Weather createWeather();
    Sound createSound();
}

2、SceneFactory1类

public class SceneFactory1 implements SceneFactory{
    @Override
    public Map createMap() {
        return new Map1();
    }

    @Override
    public Weather createWeather() {
        return new Weather1();
    }

    @Override
    public Sound createSound() {
        return new Sound1();
    }
}

3、SceneFactory2类

public class SceneFactory2 implements SceneFactory{

    @Override
    public Map createMap() {
        return new Map2();
    }

    @Override
    public Weather createWeather() {
        return new Weather2();
    }

    @Override
    public Sound createSound() {
        return new Sound2();
    }
}

4、Map接口,Sound接口,Weather接口

public interface Map {
    void display();
}

public interface Sound {
    void display();
}

public interface Weather {
    void display();
}

5、Map1,Map2

public class Map1 implements Map{
    @Override
    public void display() {
        System.out.println("Map1创建成功!");
    }
}


public class Map2 implements Map{
    @Override
    public void display() {
        System.out.println("Map2创建成功!");
    }
}

6、Sound1,Sound2

public class Sound1 implements Sound{
    @Override
    public void display() {
        System.out.println("Sound1创建成功!");
    }
}


public class Sound2 implements Sound{
    @Override
    public void display() {
        System.out.println("Sound2创建成功!");
    }
}

7、Weather1,Weather2

public class Weather1 implements Weather{
    @Override
    public void display() {
        System.out.println("Weather1创建成功!");
    }
}


public class Weather2 implements Weather{
    @Override
    public void display() {
        System.out.println("Weather2创建成功!");
    }
}

8、Clent类

public class Client {
    public static void main(String[] args) {
        SceneFactory sceneFactory;
        Map map;
        Weather weather;
        Sound sound;
        sceneFactory = (SceneFactory) XMLUtil.getBean();
        map = sceneFactory.createMap();
        weather = sceneFactory.createWeather();
        sound = sceneFactory.createSound();
        map.display();
        weather.display();
        sound.display();
    }
}

9、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 {
    public static Object getBean(){
        try {
            //创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("E:\\software_partern\\code_all\\designpattern_experiment\\src\\FPS_game\\game.xml"));
            NodeList nl = doc.getElementsByTagName("scene");
            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;
        }
    }
}

10、配置文件

<?xml version="1.0" ?>

<config>

    <scene>FPS_game.SceneFactory2</scene>

</config>

 

五、 某Web性能测试软件中包含一个虚拟用户生成器(Virtual User Generator)。为了避免出现生成的虚拟用户数量不一致,该测试软件在工作时只允许启动唯一一个虚拟用户生成器。采用单例模式设计该虚拟用户生成器,绘制类图并使用饿汉式单例双重检测锁IoDH三种方式编程模拟实现。

类图:

饿汉式单例代码:(这里代码放一起了,在IDEA里面要按类分开,由于作者太懒了下面都没有分类了)

package Web;

public class VirtualUserGenerator {
    private static final VirtualUserGenerator instance = new VirtualUserGenerator();

    private VirtualUserGenerator() {}

    public static VirtualUserGenerator getInstance() {
        return instance;
    }

    public void generateUser() {
        System.out.println("生成虚拟用户!");
    }
}
package Web;

public class Client {
    public static void main(String[] args) {
        VirtualUserGenerator generator = VirtualUserGenerator.getInstance();
        generator.generateUser();
    }
}

 双重检测锁:

public class VirtualUserGenerator {
    private static volatile VirtualUserGenerator instance;
    
    private VirtualUserGenerator() {}
    
    public static VirtualUserGenerator getInstance() {
        if (instance == null) {
            synchronized (VirtualUserGenerator.class) {
                if (instance == null) {
                    instance = new VirtualUserGenerator();
                }
            }
        }
        return instance;
    }
    
    public void generateUser() {
        System.out.println("生成虚拟用户2!");
    }
}
public class Client {
    public static void main(String[] args) {
        VirtualUserGenerator generator = VirtualUserGenerator.getInstance();
        generator.generateUser();
    }
}

 IoDH:

public class VirtualUserGenerator {
    private VirtualUserGenerator() {}
    
    private static class Holder {
        private static final VirtualUserGenerator instance = new VirtualUserGenerator();
    }
    
    public static VirtualUserGenerator getInstance() {
        return Holder.instance;
    }
    
    public void generateUser() {
        System.out.println("生成虚拟用户3!");
    }
}
public class Client {
    public static void main(String[] args) {
        VirtualUserGenerator generator = VirtualUserGenerator.getInstance();
        generator.generateUser();
    }
}

 分享一句很喜欢的话:

前路漫漫,慢慢亦灿灿,我们终会去到想去的地方,见到想见到的人!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值