实验二 创建型设计模式实验
一、 实验目的
(1)结合实例,熟练绘制创建型设计模式结构图
(2)结合实例,熟练使用Java面向对象编程语言实现创建型设计模式
(3)通过编程实践,理解每一种创建型设计模式的概念和内涵、结构、优缺点
以及应用场景
二、 实验要求
(1)使用简单工厂模式设计一个可以创建不同几何形状( Shape)(例如圆形
( Circle).、矩形 Rectangle)和三角形( ( Triangle)等的绘图工具类,每个几何图形均
具有绘制方法daw()和擦除方法 erase(),要求在绘制不支持的几何图形时,抛出一
个 UnsupportedShapeException异常。绘制类图并编程模拟实现。
(2)在某网络管理软件中,需要为不同的网络协议提供不同的连接类,例如针对
POP3协议的连接类POP3Connection、针对IMAP协议的连接类 IMAPConnection、
针对HTTP协议的连接类 HTTPConnection等。由于网络连接对象的创建过程较
为复杂,需要将其创建过程封装到专门的类中,该软件还将支持更多类型的网络协
议。现采用工厂方法模式进行设计,绘制类图并编程模拟实现。
(3)某系统为了改进数据库操作的性能,用户可以自定义数据库连接对象
Connection和语句对象 Statement,针对不同类型的数据库提供不同的连接对象和
语句对象,例如提供 Oracle或 MySQL专用连接类和语句类,而且用户可以通过配
置文件等方式根据实际需要动态更换系统数据库。使用抽象工厂模式设计该系统,
绘制对应的类图并编程模拟实现。
(4)在某赛车游戏中,赛车包括方程式赛车、场地野赛车、运动汽车、卡车等类
型,不同类型的赛车的车身、发动机、轮胎、变速箱等部件有所区别。玩家可以
自行选择赛车类型,系统将根据玩家的选择创建出一辆完整的赛车。现采用建造
者模式实现赛车的构建,绘制对应的类图并编程模拟实现
(5)某在线招聘网站中,用户可以创建一个简历模板。针对不同的工作岗位,可以
复制该简历模板并进行适当修改后,生成一份新的简历。在复制简历时,用户可以
选择是否复制简历中的照片:如果选择“是”,则照片将一同被复制,用户对新简历
中的照片进行修改不会影响到简历模板中的照片,对模板进行修改也不会影响到
新简历;如果选择“否”,则直接引用简历模板中的照片,修改简历模板中的照片将
导致新简历中的照片一同修改,反之亦然。现采用原型模式设计该简历复制功能
并提供浅克隆和深克隆两套实现方案,绘制对应的类图并编程模拟实现。
(6)某Web性能测试软件中包含一个虚拟用户生成器( Virtual User Generator)。
为了避免生成的虚拟用户数量不一致,该测试软件在工作时只允许启动唯一一个
虚拟用户生成器。采用单例模式设计该虚拟用户生成器,绘制类图并分别使用饿
汉式单例、双重检测锁等二种方式编程模拟实现。
三、 实验步骤
3.1 第一题:简单工厂模式实现创建不同几何图形
3.1.1 结构类图
3.1.2 实现代码
//接口
interface Shape {
public void init();
}
//圆形
class ReCircle implements Shape {
@Override
public void init() {
System.out.println("创建圆形");
}
}
//长方形
class Rectangle implements Shape {
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("创建长方形");
}
}
//三角形
class Triangle implements Shape {
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("创建三角形");
}
}
//几何图形工厂
class ShapeFactory {
public static Shape intiShape(String name) throws Exception {
if (name.equalsIgnoreCase("Circle")) {
System.out.println("图形工厂生产圆形");
return new ReCircle();
}
else if (name.equalsIgnoreCase("Triangle")) {
System.out.println("图形工厂生产三角形");
return new ReCircle();
}
else if (name.equalsIgnoreCase("Rectangle")) {
System.out.println("图形工厂生产长方形");
return new ReCircle();
}
else {
throw new Exception("对不起,暂不能生产该图形");
}
}
public static void deleteShape(String name) throws Exception {
if (name.equalsIgnoreCase("Circle")) {
System.out.println("已销毁圆形");
}
else if (name.equalsIgnoreCase("Triangle")) {
System.out.println("已销毁三角形");
}
else if (name.equalsIgnoreCase("Rectangle")) {
System.out.println("已销毁长方形");
}
else {
throw new Exception("对不起,工厂没有该图形");
}
}
}
//实现测试类
public class factoryTest {
public static void main(String[] args) {
try {
Shape shape = ShapeFactory.intiShape("Circle");
shape.init();
shape = ShapeFactory.intiShape("Triangle");
shape.init();
shape = ShapeFactory.intiShape("Rectangle");
shape.init();
shape = ShapeFactory.intiShape("app");
shape.init();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
}
}
3.1.3 模拟测试截图
3.2 第二题:工厂方法模式实现不同网络协议的连接
3.2.1 结构类图
3.2.2 实现代码
//连接接口
interface connection {
void connect();
}
//HTTP 连接类
class HTTPConnection implements connection{
public void connect() {
// TODO Auto-generated method stub
System.out.println("使用 HTTP 连接类");
}
}
//IMAP 连接类
class IMAPConnection implements connection{
public void connect() {
// TODO Auto-generated method stub
System.out.println("使用 IMAP 连接类");
}
}
//POP3 连接类
class POP3Connection implements connection{
public void connect() {
// TODO Auto-generated method stub
System.out.println("使用 POP3 连接类");
}
}
//连接工厂
interface ConnectionFactory {
connection getConnection();
}
//HTTP 连接工厂
class HTTPFactory implements ConnectionFactory {
@Override
public connection getConnection() {
// TODO Auto-generated method stub
return new HTTPConnection();
}
}
//IMAP 连接工厂
class IMAPFactory
implements ConnectionFactory{
@Override
public connection getConnection() {
// TODO Auto-generated method stub
return new IMAPConnection();
}
}
//POP3 连接工厂
class POP3Factory implements ConnectionFactory {
@Override
public connection getConnection() {
// TODO Auto-generated method stub
return new POP3Connection();
}
}
//实现测试类
public class MethodTest {
public static void main(String[] args) {
new POP3Factory();
ConnectionFactory factory =null;
//POP3
factory =
connection pop3 = factory.getConnection();
pop3.connect();
//IMAP
factory = new IMAPFactory();
connection imap = factory.getConnection();
imap.connect();
//HTTP
factory = new HTTPFactory();
connection http =factory.getConnection();
http.connect();
}
}
3.2.3 模拟测试截图
3.3 第三题:抽象工厂模式实现数据库的连接
3.3.1 结构类图
3.3.2 实现代码
//抽象连接类
abstract class Connection {
abstract void connect();
}
//MySql 连接类
class MySqlConnection extends Connection{
@Override
void connect() {
// TODO Auto-generated method stub
System.out.println("MySqlConnection");
}
}
//Oracle 连接类
class OracleConnection extends Connection {
@Override
void connect() {
// TODO Auto-generated method stub
System.out.println("OracleConnection");
}
}
//SqlServer 连接类
class SqlServerConnection extends Connection {
@Override
void connect() {
// TODO Auto-generated method stub
System.out.println("SqlServerConnection");
}
}
//抽象 Statement 类
abstract class Statement {
abstract void operate();
}
//MySql Statement 类
class MySqlStatement extends Statement {
@Override
void operate() {
// TODO Auto-generated method stub
System.out.println("MySqlStatements");
}