当前位置:文档之家› java实训报告

java实训报告

实习报告实习性质:《Java面向对象编程》课程实习学生姓名:专业班级:指导教师:实习时间:实习地点:XXXXXXXXXXXXX学院学生实习考核表目录1 实习目的 (1)2 实习概况 (1)2.1 实习要求 (1)2.2 实习时间 (1)2.3 实习环境 (1)2.4 开发环境 (1)3 实习内容 (1)3.1 设计模式 (1)3.1.1 单例模式 (1)3.1.2 观察者模式 (3)3.1.3 代理模式 (4)3.1.4 集合应用 (5)3.2 访问数据库 (6)3.2.1 连接数据库 (6)3.2.2 添加数据 (7)3.2.3 查询数据 (8)3.2.4 修改数据 (8)3.2.5 删除数据 (8)3.3 游戏设计 (9)3.3.1 游戏设计分析 (9)3.3.2 登陆窗口设计 (10)3.3.3 注册窗口设计 (10)3.4 游戏需求: (10)3.4.1 地图文件的引用 (11)3.4.2 详细设计 (11)4 学习总结 (17)4.1 学习所得 (17)4.2 经验教训 (17)4.3 实训体会 (18)信息工程学院《Java面向对象》实训报告1 实习目的综合运用在校期间所学到的理论知识和技能,让自己能够熟悉并熟练应用系统的开发过程,培养独立思考能力,检验学习成果和实际动手能力,以及提高工程实践能力,为今后的工作打下坚实的基础。

2 实习概况2.1实习要求1.设计模式(1)单例模式(2)观察者模式(3)代理模式2.集合应用设计一个案例,用集合解决实际问题3.访问数据库设计一个案例,连接数据库,进行添加、删除、修改、查询4.综合应用设计一个用图形界面的数据库应用程序(小型管理系统),或一个小游戏注意:实习报告要图文并茂,注重分析、设计过程和经验总结,代码所占篇幅不超过整个篇幅的一半。

2.2 实习时间XXXXXXX2.3 实习环境XXXXXX实训室2.4 开发环境●操作系统(Win10)●使用软件(eclipse、Navicat)●数据库(MySQL)3 实习内容3.1 设计模式3.1.1 单例模式1、饿汉模式饿汉模式是最简单的一种实现方式,饿汉模式在类加载的时候就对实例进行创建,实例在整个程序周期都存在。

它的好处是只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问题。

它的缺点是即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。

1 2 3 4 5 6 7 public class Singleton{private static Singleton instance = new Singleton();private Singleton(){}public static Singleton newInstance(){return instance;}}2、懒汉模式懒汉模式中单例是在需要的时候才去创建的,如果单例已经创建,再次调用获取接口将不会重新创建新的对象,而是直接返回之前创建的对象。

如果某个单例使用的次数少,并且创建单例消耗的资源较多,那么就需要实现单例的按需创建,这个时候使用懒汉模式就是一个不错的选择。

但是这里的懒汉模式并没有考虑线程安全问题,在多个线程可能会并发调用它的getInstance()方法,导致创建多个实例,因此需要加锁解决线程同步问题,实现如下。

1 2 3 4 5 6 7 8 9101112131415 public class Singleton{private Singleton(){}private static Singleton instance;public static Singleton getInstance(){if(instance == null){return instance = new Singleton();}else{return instance;}}}两个线程的instance都为空,这样就会生成两个实例。

解决的办法是同步:1 2 3 4 5 6 7 8 9 public class Singleton{private Singleton(){}private static Singleton instance;public static synchronized Singleton getInstance(){ if(instance == null){return instance = new Singleton();}else{10111213return instance;}}}3、双重校验锁加锁的懒汉模式看起来即解决了线程并发问题,又实现了延迟加载,然而它存在着性能问题,依然不够完美。

synchronized修饰的同步方法比一般方法要慢很多,如果多次调用getInstance(),累积的性能损耗就比较大了。

因此就有了双重校验锁,先看下它的实现代码。

1 2 3 4 5 6 7 8 9101112131415 public class Singleton{private static Singleton single; //声明静态的单例对象的变量private Singleton(){} //私有构造方法public static Singleton getSingle(){ //外部通过此方法可以获取对象if(single == null){synchronized (Singleton.class) { //保证了同一时间只能只能有一个对象访问此同步块if(single == null){single = new Singleton();}}}return single; //返回创建好的对象}}3.1.2 观察者模式当对象间存在一对多关系时,则使用观察者模式。

察者模式使用三个类Subject、Observer 和Client。

Subject 对象带有绑定观察者到Client 对象和从Client 对象解绑观察者的方法。

被观察者:ServerManager1 2 3 4 5 6 7 8 9 import java.util.Observable;public class ServerManager extends Observable {private int data = 0;public int getData(){ return data; }public void setData(int i){if(this.data != i){ this.data = i;setChanged();}notifyObservers(); //只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。

} }}}观察者一:AObserver1 2 3 4 5 6 7 8 910111213 import java.util.Observable;import java.util.Observer;public class AObserver implements Observer {public AObserver(ServerManager sm) {super();// TODO Auto-generated constructor stubsm.addObserver(this);//注册加入观察者}@Overridepublic void update(Observable arg0, Object arg1) {System.out.println("AObserver: "+((ServerManager) arg0).getData()); }}观察者二:BObserver1 2 3 4 5 6 7 8 910111213 import java.util.Observable;import java.util.Observer;public class BObserver implements Observer {public BObserver(ServerManager sm) {super();sm.addObserver(this);//注册加入观察者}@Overridepublic void update(Observable o, Object arg) {// TODO Auto-generated method stubSystem.out.println("BObserver "+((ServerManager) o).getData()); }}测试:1 2 3 4 5 6 7 8 9 public class TestDemo {public static void main(String[] args) {ServerManager sm = new ServerManager();AObserver a = new AObserver(sm);BObserver b = new BObserver(sm);sm.setData(5);sm.deleteObserver(a);//注销观察者,以后被观察者有数据变化就不再通知这个已注销的观察者 sm.setData(10);}}3.1.3 代理模式代理模式可以有两种实现的方式,一种是静态代理类,另一种是各大框架都喜欢的动态代理。

Subject接口的实现1 2 3 public interface Subject {void visit();}实现了Subject接口的第一个类:1 2 3 4 5 6 7 public class RealSubject implements Subject { private String name = "byhieg";@Overridepublic void visit() {System.out.println(name);}}实现了Subject接口的第二个类:1 2 3 4 5 6 7 8 9 10 public class ProxySubject implements Subject{ private Subject subject;public ProxySubject(Subject subject) { this.subject = subject;}@Overridepublic void visit() {subject.visit();}}具体的调用如下:1 2 3 4 5 6 public class Client {public static void main(String[] args) {ProxySubject subject = new ProxySubject(new RealSubject());subject.visit();}}3.1.4 集合应用集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。

相关主题