栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

原型模式简介及作用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

原型模式简介及作用

目录

一、概念:

二、代码示例


一、概念:

原型模式主要解决的是创建重复对象的问题,用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和实例原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。该模式最显著的一个特征就是对象的克隆;

模式的结构特点:

1.抽象原型类:具体原型对象继承后必须要实现的接口;

2.具体原型类:实现抽象原型类的clone()方法,它是可以被复制的对象,即原型模式中的那个原型对象;

3.访问类:使用具体原型类中的clone()方法来复制新的对象;

优点:

  • 性能提高,java自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。
  • 逃避构造函数的约束,可以直接克隆已有的实例对象。

缺点:

  • 要为每一个类都配置一个 clone 方法
  • clone 方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违背了开闭原则。

二、代码示例

下面我们就建一个模拟工程,示例的大体业务场景是为学生创建一套试卷,试卷由选择题组成,创建试卷的时候,每个学生的选择题顺序不一致,同时每个选择的选项顺序也不一致;下面我们就一起通过代码来看看实现的过程是什么样的;

1.选择题类

import com.alibaba.fastjson.JSONObject;
import lombok.Data;

import java.util.Map;


@Data
public class ChoiceQuestion {

    
    private String name;

    
    private Map option;

    
    private String key;

    public ChoiceQuestion(){}

    public ChoiceQuestion(String name, Map option, String key) {
        this.name = name;
        this.option = option;
        this.key = key;
    }

    @Override
    public String toString () {
        return JSONObject.toJSONString(this);
    }
}

2.考生试卷类:(抽象原型类)

import lombok.Data;

import java.util.ArrayList;
import java.util.Collections;


@Data
public class QuestionBank implements Cloneable {

    
    private String candidate;

    
    private String number;

    
    private ArrayList choiceQuestionList = new ArrayList();

    
    public QuestionBank append(ChoiceQuestion choiceQuestion) {
        choiceQuestionList.add(choiceQuestion);
        return this;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        QuestionBank questionBank = (QuestionBank) super.clone();
        questionBank.choiceQuestionList = (ArrayList) choiceQuestionList.clone();

        // 题目混排
        Collections.shuffle(questionBank.choiceQuestionList);

        // 题目的选项及答案混排
        ArrayList choiceQuestionList = questionBank.choiceQuestionList;
        for (ChoiceQuestion question : choiceQuestionList) {
            Topic random = TopicRandomUtil.random(question.getOption(), question.getKey());
            question.setOption(random.getOption());
            question.setKey(random.getKey());
        }
        return questionBank;
    }

}

3.选择题组成类,用于给选择题混排;

import com.alibaba.fastjson.JSONObject;
import lombok.Data;

import java.util.Map;


@Data
public class Topic {

    
    private Map option;

    
    private String key;


    public Topic(Map option,String key){
        this.option = option;
        this.key = key;
    }

    @Override
    public String toString () {
        return JSONObject.toJSONString(this);
    }
}

4.选择题混排工具类

import java.util.*;


public class TopicRandomUtil {

    
    public static Topic random(Map option,String key) {
        Set keySet = option.keySet();
        List keyList = new ArrayList<>(keySet);
        Collections.shuffle(keyList);

        Map optionNew = new HashMap<>();

        int idx = 0;
        String newKey = "";
        for(String next : keySet){
            String randomKey = keyList.get(idx++);
            if(key.equals(next)){
                newKey = randomKey;
            }
            optionNew.put(randomKey,option.get(next));
        }

        return new Topic(optionNew,newKey);
    }


}

5.数据初始化(访问类:使用考卷实例questionBank进行复制克隆新的对象方法)

及main方法测试

import com.alibaba.fastjson.JSON;

import java.util.HashMap;
import java.util.Map;


public class QuestionBankInit {

    private QuestionBank questionBank = new QuestionBank();

    public QuestionBankInit(){
        Map map1 = new HashMap<>();
        map1.put("A","Java");
        map1.put("B","python");
        map1.put("C","C++");
        map1.put("D","php");
        Map map2 = new HashMap<>();
        map2.put("A","狗");
        map2.put("B","猫");
        map2.put("C","老鼠");
        map2.put("D","青蛙");
        Map map3 = new HashMap<>();
        map3.put("A","乒乓球");
        map3.put("B","男足");
        map3.put("C","排球");
        map3.put("D","篮球");
        questionBank.append(new ChoiceQuestion("最好的开发语言是?",map1,"A"))
                    .append(new ChoiceQuestion("什么动物爱吃老鼠?",map2,"B"))
                    .append(new ChoiceQuestion("什么体育运动最伤中国人的心?",map3,"B"));
    }

    
    public String createPaper(String candidate,String number) throws CloneNotSupportedException{
        QuestionBank questionBankClone = (QuestionBank)questionBank.clone();
        questionBankClone.setCandidate(candidate);
        questionBankClone.setNumber(number);
        return JSON.toJSONString(questionBankClone);
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        QuestionBankInit questionBankInit = new QuestionBankInit();
        System.out.println(questionBankInit.createPaper("小明","001"));
        System.out.println(questionBankInit.createPaper("小张","002"));
        System.out.println(questionBankInit.createPaper("小杨","003"));
    }

}

查看执行结果:从结果中我们看到,不同学生的选择题及选项的顺序都是不一样的,达到了混排的目的,到此就演示结束了;

 

版权声明:以上代码示例参考《重学JAVA设计模式》一书。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832253.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号