课时94:案例分析三(图形)
摘要:图形抽象类与工厂设计模式的定义与应用
1.图形抽象类的定义
2.具体图形子类的实现
3.工厂设计模式的应用
01.图形抽象类的定义
定义类Shape。用表示一般二维图形。Shape具有抽象方法area和perimter,分别用来计算形状的面积和周长。试定义一些二维形状类(如矩形、三角形、圆形、椭圆形等),这些类均为Shape类的子类。
从图形设计的角度来看,“图形” 本身是一个抽象的概念,就如同 “行为” 一样,它没有具体的实例,但可以有各种具体的表现形式,如圆形、矩形等。因此,我们需要将 “图形” 定义为一个抽象类。
在 Java 中,定义抽象类时,我们使用Abstract关键字。以下是定义图形抽象类的示例代码:
abstract class AbstractShape { public abstract double area(); // 抽象方法:计算面积 public abstract double perimeter(); // 抽象方法:计算周长 }
02.具体图形子类的实现
2.1圆形子类
圆形是一种常见的二维图形,它的面积和周长的计算依赖于半径。以下是圆形子类的实现代码:
class Circular extends AbstractShape { private double radius; public Circular(double radius) { this.radius = radius; } public double area() { return 3.1415926 * this.radius * this.radius; } public double perimeter() { return 2 * 3.1415926 * this.radius; } }
在上述代码中,Circular类继承自Shape抽象类,并实现了area()和perimeter()方法。在area()方法中,我们使用Math.PI表示圆周率,通过公式π * r * r计算圆形的面积;在perimeter()方法中,使用公式2 * π * r计算圆形的周长。
2.2矩形子类
矩形也是一种常见的二维图形,它的面积和周长的计算依赖于长和宽。以下是矩形子类的实现代码:
class Rectangle extends AbstractShape { private double length; private double width; public Rectangle(double length, double width) { this.length = length; this.width = width; } public double area() { return this.length * this.width; } public double perimeter() { return 2 * (this.length + this.width); } }
在上述代码中,Rectangle类继承自Shape抽象类,并实现了area()和perimeter()方法。在area()方法中,通过公式长 * 宽计算矩形的面积;在perimeter()方法中,使用公式2 * (长 + 宽)计算矩形的周长。
03.工厂设计模式的应用
在实际编程中,为了隐藏对象创建的细节,提高代码的可维护性和灵活性,我们可以使用工厂设计模式。工厂设计模式的主要特点是将对象的创建和使用分离,通过一个工厂类来负责对象的创建。
以下是一个简单的图形工厂类的实现代码:
class Factory { public static AbstractShape getInstance(String className, double... args) { if ("Circular".equalsIgnoreCase(className)) { return new Circular(args[0]); } else if ("Rectangle".equalsIgnoreCase(className)) { return new Rectangle(args[0], args[1]); } else { return null; } } } public class JavaDemo { public static void main(String args[ ]) { AbstractShape asa = Factory.getInstance("Circular", 1.1); AbstractShape asb = Factory.getInstance("Rectangle", 1.5, 10.2); System.out.println("圆形面积:" + asa.area() + "、圆形周长:"+asa.perimeter()); System.out.println("矩形面积:" + asb.area() + "、矩形周长:"+asb.perimeter()); } }
在上述代码中,我们通过 Factory 类的 getInstance()方法创建了一个圆形对象和一个矩形对象,并分别调用它们的area()和perimeter()方法计算面积和周长,最后将结果输出。
通过定义图形抽象类和具体的图形子类,并结合工厂设计模式,我们实现了对二维图形的有效管理和计算。抽象类为具体的图形子类提供了统一的接口,使得代码具有更好的可扩展性和可维护性;工厂设计模式隐藏了对象创建的细节,使得代码更加灵活和易于修改。
在实际编程中,我们可以根据需要添加更多的图形子类,并在工厂类中相应地添加创建对象的逻辑,从而实现对更多类型图形的支持。