一.题目:
利用接口和接口回调,实现简单工厂模式,当输入不同字符,代表相应图形时,利用工厂类获得图形对象,再计算以该图形为底的柱体体积。
二.代码及注释:
1.正方形类:
//*定义一个正方形类来继承Shape接口,其正方形边长为length及求其面积方法*// package ccut.lyq; public class zhengfangxing implements Shape { double length; double area; zhengfangxing(double length){ this.length=length; } public double getArea(){ return area=length*length; } }
2.三角形类:
//*定义一个三角形类继承shape接口*其三角形边长为a,b,c,及三角形构造方法和重写面积方法// package ccut.lyq; public class sanjiaoxing implements Shape{ double a; double b; double c; sanjiaoxing(double a,double b,double c){ this.a=a; this.b=b; this.c=c; } public double getArea(){ double d=(a+b+c)/2; return Math.sqrt(d*(d-a)*(d-b)*(d-c)); } }
3.矩形类:
//*定义一个矩形类继承shape结口,定义矩形长为chang,宽为kuan,计算矩形面积*// package ccut.lyq; public class juxing implements Shape{ double kuan; double chang; juxing(double kuan,double chang){ this.chang=chang; this.kuan=kuan; } public double getArea(){ return kuan*chang; } }
4.梯形类:
//*定义一个梯形类继承shape接口*// package ccut.lyq; public class juxing implements Shape{ double shangdi; double xiadi; double gao; juxing(double shangdi,double xiadi,double gao){ this.xiadi=xiadi; this.shangdi=shangdi; this.gao=gao; } public double getArea(){ return(shangdi+xiadi)*gao/2; } }
5.圆形类:
//*定义圆形类继承shape接口,圆边长为r,及圆的构造方法和重写面积的方法*// package ccut.lyq; public class Circle implements Shape{ double r; final double PI=3.14; Circle(double r){ this.r=r; } public double getArea(){ return PI*r*r; } }
6.柱体类:
//*定义柱体类,定义一个换底方法,定义柱体的高,及图形面积*// package ccut.lyq; public class Cone { Shape shape; double high; public Cone(Shape shape,double high){ this.shape=shape; this.high=high; } public double getVolume(){ return shape.getArea()*high; } public void setShape(Shape shape){ this.shape=shape; } }
7.工厂类:
//*创建一个工厂类,图形对象为空,并用switch语句选择柱体的底的形状*// package ccut.lyq; import java.util.*; public class Factory { Shape shape=null; Scanner input=new Scanner(System.in); public Factory(double height){ Cone cone=new Cone(this.getShape(),height); System.out.println(cone.getVolume()); } public Shape getShape(){ System.out.println("请选择底的图形:矩形:R;正方形:S;圆形:C;三角形:V;梯形:T"); char A=input.next().charAt(0); switch(A){ case'R':System.out.println("以矩形为底的柱体体积为:");shape=new Rectangle(3,6);break; case'S':System.out.println("以正方形为底的柱体体积为:");shape=new Square(5);break; case'C':System.out.println("以圆形为底的柱体体积为:");shape=new Circle(8);break; case'V':System.out.println("以三角形为底的柱体体积为:");shape=new Triangle(5,3,5);break; case'T':System.out.println("以梯形为底的柱体体积为:");shape=new Trapezoid(3,5,7);break; } return shape; } }
8.图形类:
//*定义一个shape接口用来做柱体的底*// package ccut.lyq; public interface Shape { abstract double getArea(); }
9.主类:
//*主类*// package ccut.lyq; public class Text { public static void main(String[] args) { double height=6; Factory factory=new Factory(height); } }
三.运行结果: