1. 简单工厂模式。 用面向对象思想实现一个简单计算器,绘制类图并编程实现。
2. 工厂方法模式日志记录器。某系统日志记录器要求支持多种日志记录方式,如文件日志记录(FileLog)、数据库日志记录(DatabaseLog)等,且用户可以根据要求动态选择日志记录方式,现使用工厂模式设计该系统。
3. 抽象工厂模式之数据库操作工厂。某系统为了改进数据库操作的性能,自定义数据为连接对象(Connection)和语句(Statement)对象,可针对不同类型的数据库提供不同的连接对象和语句对象,如提供Oracle或MySQL专用连接类和语句类,而且用户可以通过配置文件等方式根据实际需要动态更换系统数据库。
4. 原型模式之创建工作周报。在某OA系统中,用户可以创建工作周报,由于某些岗位周周工作存在重复性,因此可以通过复制原有工作周报并进行局部修改来快速新建工作周报。
5. 单例模式之多文档窗口。使用单例模式设计一个多文档窗口,要求在主窗体中某个内部子窗体只能实例化一次,即只能弹出一个相同的子窗体。
实验一:一、简单工厂
uml图
源代码:
AddOperation:
public class AddOperation extends Operation {
public double getResult() {
return numA + numB;
}
}
DivOperation:
public class DivOperation extends Operation {
@Override
public double getResult() {
if(numB == 0)
throw new RuntimeException("除数不能为0!");
return numA / numB;
}
}
MulOperation:
public class MulOperation extends Operation {
@Override
public double getResult() {
return numA * numB;
}
}
Operation:
public abstract class Operation {
protected double numA;
protected double numB;
public double getNumA() {
return numA;
}
public void setNumA(double numA) {
this.numA = numA;
}
public double getNumB() {
return numB;
}
public void setNumB(double numB) {
this.numB = numB;
}
public abstract double getResult();
}
OperationFactory:
public class OperationFactory {
public static Operation createOperation(String operate) {
Operation op = null;
if(operate == null)
throw new RuntimeException("运算符不能为空!");
else if(operate.equals("+"))
op = new AddOperation();
else if(operate.equals("-"))
op = new SubOperation();
else if(operate.equals("*"))
op = new MulOperation();
else if(operate.equals("/"))
op = new DivOperation();
else
throw new RuntimeException("运算符错误!");
return op;
}
}
OperationTest:
import java.util.Scanner;
public class OperationTest {
public static void main(String[] args) {
Operation op = null;
Scanner scanner = new Scanner(System.in);
try {
do {
System.out.println("输入数字A:");
double numA = scanner.nextDouble();
System.out.println("输入运算符(+、-、*、/):");
String operate = scanner.next();
System.out.println("输入数字B:");
double numB = scanner.nextDouble();
op = OperationFactory.createOperation(operate);
op.setNumA(numA);
op.setNumB(numB);
double result = op.getResult();
System.out.println("运算结果为:" + result);
System.out.println("是否继续操作(Y/N):");
} while(!scanner.next().equalsIgnoreCase("n"));
} catch (RuntimeException e) {
System.err.println("程序发生异常退出!");
e.printStackTrace();
}
}
}
SubOperation:
public class SubOperation extends Operation {
@Override
public double getResult() {
return numA - numB;
}
}
二:工厂模式:
题目:某系统日志记录器要求支持多种日志记录方式,如文件日志记录(FileLog)、数据库日志记录(DatabaseLog)等,且用户可以根据要求动态选择日志记录方式,现使用工厂模式设计该系统。
类图
public class Client {
public static void main(String[] args) {
try {
Log log;
//LogFactory factory1;
LogFactory factory2;
//factory1 = new DatabaseLogFactory();
factory2 = new FileLogFactory();
//factory = (LogFactory)XMLUtil.getBean();
log = factory2.createLog();
log.writeLog();
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
public class DatabaseFile implements Log{
public void writeLog() {
System.out.println("数据库日志写入中。。。");
}
}
public class DatabaseLogFactory implements LogFactory{
public Log createLog() {
System.out.println("数据库日志工厂生产数据库日志。");
return new DatabaseFile();
}
}
public class FileLog implements Log{
public void writeLog() {
System.out.println("文件日志写入中。。。");
}
}
public class FileLogFactory implements LogFactory{
public Log createLog() {
System.out.println("文件日志工厂生产文件日志。");
return new FileLog();
}
}
public interface Log {
public void writeLog();
}
public interface LogFactory {
public Log createLog();
}
三、深、浅克隆
浅克隆
源代码
package 浅克隆;
public class WeeklyLog implements Cloneable {
private String content;
private String name;
private String date;
public WeeklyLog() {}
public WeeklyLog(String content, String name, String date) {
this.content = content;
this.name = name;
this.date = date;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public Object clone(){
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
package 浅克隆;
public class test {
public void showWeek (WeeklyLog wl){
System.out.println("*******" + wl.getDate() + "************");
System.out.println(wl.getName());
System.out.println(wl.getContent());
System.out.println("———————————————————————————————");
}
public static void main(String[] args) {
WeeklyLog wl = new WeeklyLog("好好学习,天天向上", "张三", "第七周");
test t = new test();
t.showWeek(wl);
WeeklyLog w2;
w2 = (WeeklyLog)wl.clone();
w2.setDate("第八周");
t.showWeek(w2);
System.out.print("wl == w2:");
System.out.println(wl == w2);
}
}
深克隆
uml图
..
源代码:
package 深克隆;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class WeeklyLog implements Cloneable {
private String content;
private String name;
private String date;
private int[] a = {1, 2};
public WeeklyLog() {}
public WeeklyLog(String content, String name, String date) {
this.content = content;
this.name = name;
this.date = date;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public Object clone(){
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
public Object deepClone() throws IOException, ClassNotFoundException{
ByteArrayOutputStream bao = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bao);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
public int[] displayarray(){
return this.a;
}
}
package 深克隆;
import java.io.IOException;
public class test {
public void showWeek (WeeklyLog wl){
System.out.println("*******" + wl.getDate() + "************");
System.out.println(wl.getName());
System.out.println(wl.getContent());
System.out.println("———————————————————————————————");
}
public static void main(String[] args) {
WeeklyLog wl = new WeeklyLog("好好学习,天天向上", "张三", "第七周");
WeeklyLog w2 = new WeeklyLog();
WeeklyLog w3 = new WeeklyLog();
test t = new test();
t.showWeek(wl);
try {
w2 = (WeeklyLog)wl.deepClone();
} catch (ClassNotFoundException | IOException e) {
//e.printStackTrace();
}
System.out.print("[深克隆]wl.displayarray()==w2.displayarray():");
System.out.println(wl.displayarray() == w2.displayarray());
w3 = (WeeklyLog)wl.clone();
System.out.print("[浅克隆]wl.displayarray()==w3.displayarray():");
System.out.println(wl.displayarray() == w3.displayarray());
}
}