设计模式
设计模式:
23种设计模式 单例设计模式 工厂设计模式 装饰者模式 生产者模式
单例设计模式三步走:
1.构造方法私有化(目的:不能在外部通过new随意创建对象)
2.在类内部创建对象,作为私有静态属性
3.对外提供公有静态的get方法
饿汉模式
//当做属性去 private static SingleDemo sd=new SingleDemo(); private SingleDemo(){
} //返回singleDemo对象 public static SingleDemo getSingleDemo(){ return SingleDemo.sd; } |
懒汉模式
//当做属性去 private static SingleDemo sd; private SingleDemo(){
} //返回singleDemo对象 public static SingleDemo getSingleDemo(){ if(sd==null){ sd=new SingleDemo(); } return sd; } |
单例设计模式综合练习:
设计一个单例模式的选题器
设计一个老师类和学生类
学生类登录进入考试系统
首先选题器从总题库中选择一些题进入考试题库
学生利用考试题库进行答题考试
考试完成后学生将填满答案的“试卷”交给教师进行评分,
当方法的返回值类型和参数列表为自定义类型时:
特点:
优点:对象唯一,访问量过大时可以避免内存溢出
缺点:普通属性也变成唯一的
应用场景:
1
public class KaoShiTi {
//有一张试卷
public String[][] paper=new String[4][2];
}
2
public class Student {
//定义做题的方法
public String[] answer(KaoShiTi kst){
//拿到试卷
String[][] question=kst.paper;
String[] ans=new String[question.length];
Scanner sc=new Scanner(System.in);
for(int i=0;i<question.length;i++){
System.out.println(question[i][0]);
System.out.println("请回答:");
ans[i]=sc.nextLine();
}
return ans;
}
}
3
public class Teacher {
public int pi(KaoShiTi kst,String[] ans){
String[][] paper=kst.paper;
int score=0;
for(int i=0;i<paper.length;i++){
String answer=paper[i][1];
if(answer.equals(ans[i])){
score+=25;
}
}
return score;
}
}
4
public class XuanTiQi {
private static XuanTiQi xtq=new XuanTiQi();
private XuanTiQi(){
}
public static XuanTiQi getXuanTiQi(){
return XuanTiQi.xtq;
}
//从总题库中抽屉到考试题库
public KaoShiTi getQuestion(ZongTiKu ztk){
KaoShiTi kst=new KaoShiTi();
String[][] values01=ztk.questions;
String[][] values02=kst.paper;
for(int i=0;i<4;i++){
int index=(int)(Math.random()*values01.length);
values02[i]=values01[index];
}
return kst;
}
}
5
public class ZongTiKu {
//给题
public String[][] questions={{"1.今天吃饱了吗 \nA 饱了\n B 没有 \nC 不知道 \nD 你猜","A"},
{"2.今天吃饱了吗 \nA 饱了\n B 没有 \nC 不知道 \nD 你猜","D"},
{"3.今天吃饱了吗 \nA 饱了\n B 没有 \nC 不知道 \nD 你猜","B"},
{"4.今天吃饱了吗 \nA 饱了\n B 没有 \nC 不知道 \nD 你猜","C"},
{"5.今天吃饱了吗 \nA 饱了\n B 没有 \nC 不知道 \nD 你猜","A"},
{"6.今天吃饱了吗 \nA 饱了\n B 没有 \nC 不知道 \nD 你猜","B"},
{"7.今天吃饱了吗 \nA 饱了\n B 没有 \nC 不知道 \nD 你猜","D"},
{"8.今天吃饱了吗 \nA 饱了\n B 没有 \nC 不知道 \nD 你猜","A"}};
}
Test
public class Test {
public static void main(String[] args) {
Student st=new Student();
XuanTiQi xtq=XuanTiQi.getXuanTiQi();
ZongTiKu ztk=new ZongTiKu();
KaoShiTi kst=xtq.getQuestion(ztk);
String[] ans=st.answer(kst);
Teacher t=new Teacher();
int score=t.pi(kst, ans);
System.out.println(score);
}
}