软件系统设计与体系结构——实验八、创建型设计模式
软件系统设计与体系结构——实验八、创建型设计模式
实验目的
掌握创建型设计模式的原则、方法和技巧。
实验内容及步骤
实验内容1:简单工厂模式
- UML类图
- 代码实现
(1) Shape 接口:
public interface Shape {
void draw();
void erase();
}
(2) UnsupportedShapeException 自定义异常:
public class UnsupportedShapeException extends Exception {
public UnsupportedShapeException(String message) {
super(message);
}
}
(3) ShapeFactory 工厂类:
public class ShapeFactory {
public Shape getShape(String shapeType) throws UnsupportedShapeException {
if (shapeType == null) {
throw new UnsupportedShapeException("Shape type cannot be null.");
}
switch (shapeType.toLowerCase()) {
case "circle":
return new Circle();
case "rectangle":
return new Rectangle();
case "triangle":
return new Triangle();
default:
throw new UnsupportedShapeException("Unsupported shape type: " + shapeType);
}
}
public Circle getCircle() {
return new Circle();
}
}
(4) Circle 类:
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a circle.");
}
@Override
public void erase() {
System.out.println("Erasing a circle.");
}
}
(5) Rectangle 类:
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a rectangle.");
}
@Override
public void erase() {
System.out.println("Erasing a rectangle.");
}
}
(6) Triangle 类:
public class Triangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a triangle.");
}
@Override
public void erase() {
System.out.println("Erasing a triangle.");
}
}
- 相关解释
在这个设计中,ShapeFactory
负责根据传入的类型字符串创建相应的Shape
对象。如果传入的类型不支持,则抛出UnsupportedShapeException
异常。每个具体的Shape
类实现了draw()
和erase()
方法,以执行相应的绘制和擦除操作。这样的设计使得添加新的几何形状变得简单,只需添加新的类实现Shape
接口,并在ShapeFactory
中添加相应的逻辑即可。
实验内容2:抽象工厂模式
- UML类图
- 代码实现
(1) Bicycle 抽象产品类:
public abstract class Bicycle {
public abstract void ride();
}
(2) AIMABicycle 具体产品类:
public class AIMABicycle extends Bicycle {
@Override
public void ride() {
System.out.println("ride an AIMA bicycle.");
}
}
(3) YadeaBicycle 具体产品类:
public class YadeaBicycle extends Bicycle {
@Override
public void ride() {
System.out.println("ride a Yadea bicycle.");
}
}
(4) TAILGBicycle 具体产品类:
public class TAILGBicycle extends Bicycle {
@Override
public void ride() {
System.out.println("ride a TAILG bicycle.");
}
}
(5) BicycleFactory 抽象工厂类:
public abstract class BicycleFactory {
public abstract Bicycle createBicycle();
}
(6) AIMAFactory 具体工厂类:
public class AIMAFactory extends BicycleFactory {
@Override
public Bicycle createBicycle() {
return new AIMABicycle();
}
}
(7) YadeaFactory 具体工厂类:
public class YadeaFactory extends BicycleFactory {
@Override
public Bicycle createBicycle() {
return new YadeaBicycle();
}
}
(8) TAILGFactory 具体工厂类:
public class TAILGFactory extends BicycleFactory {
@Override
public Bicycle createBicycle() {
return new TAILGBicycle();
}
}
- 相关解释
(1) BicycleFactory 抽象工厂类:定义了一个创建电动自行车的接口(抽象方法),每个具体的工厂都需要实现这个方法。
(2) AIMAFactory 具体工厂类:这个类是BicycleFactory的一个子类,专门负责生产爱玛牌电动自行车。
(3) YadeaFactory 具体工厂类:这个类是BicycleFactory的一个子类,专门负责生产雅迪牌电动自行车。
(4) TAILGFactory 具体工厂类:这个类也是BicycleFactory的一个子类,专门负责生产台铃牌电动自行车。
(5) Bicycle 抽象产品类:定义了电动自行车的公共接口,所有品牌的电动自行车都需要实现这个接口。
(6) AIMABicycle 具体产品类:实现了Bicycle接口,代表爱玛牌电动自行车。
(7) YadeaBicycle 具体产品类:实现了Bicycle接口,代表雅迪牌电动自行车。
(8) TAILGBicycle 具体产品类:实现了Bicycle接口,代表台铃牌电动自行车。
在这个设计中,如果需要添加一个新的电动自行车品牌,只需要创建一个新的具体工厂类和对应的具体产品类,而不需要修改现有的代码。这符合开闭原则,即对扩展开放,对修改封闭。