Java面向对象案例-工厂模式

1 篇文章 0 订阅
1 篇文章 0 订阅

Java面向对象案例-工厂模式

案例要求

在这里插入图片描述

代码实现

定义Shape接口类

package javaclass.shapes;

public interface Shape {

    // 计算面积
    double getArea();

    // 计算周长
    double getPerimeter();

}

定义Graph抽象类并实现Shape接口

package javaclass.shapes;

public abstract class Graph implements Shape{
   // 周长
    private double perimeter;
    // 面积
    private double area;

    @Override
    public double getPerimeter() {
        return perimeter;
    }

    public void setPerimeter(double perimeter) {
        this.perimeter = perimeter;
    }

    @Override
    public double getArea() {
        return area;
    }

    public void setArea(double area) {
        this.area = area;
    }

    // 输出图形的基本信息
    void printSting(){
        System.out.println("图形周长 = " + perimeter);
        System.out.println("图形面积 = " + area);
    };

    /**
     * 比较两个图形的面积大小
     * 小于 -1
     * 等于 0
     * 大于 1
     * @param o
     * @return
     */
    public int compareArea(Object o) {
        Graph graph = (Graph) o;    // 类型转换
        int compare = 0;        // 比较结果
        if(this.getArea()>graph.area){
            compare=-1;
        }else if(this.getArea()<graph.area){
            compare=1;
        }
        return compare;
    }
}

创建子类继承Graph类

Circle类
package javaclass.shapes;

/**
 * 圆形
 */
public class Circle extends Graph {

    // 半径
    private int r=5;

    public int getR() {
        return r;
    }

    public void setR(int r) {
        this.r = r;
    }

    @Override
    public double getArea() {
        return 2*Math.PI*r;
    }

    @Override
    public double getPerimeter() {
        return r*r*Math.PI;
    }
}

Ellipse类
package javaclass.shapes;

/**
 * 椭圆形
 */
public class Ellipse extends Graph{

    // 长半轴长
    private int a=6;
    // 短半轴长
    private int b=4;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public int getB() {
        return b;
    }

    public void setB(int b) {
        this.b = b;
    }

    @Override
    public double getArea() {
        return Math.PI*a*b;
    }

    @Override
    public double getPerimeter() {
        return 2*Math.PI*b+4*(a-b);
    }
}

Rectangle类
package javaclass.shapes;

/**
 * 长方形
 */
public class Rectangle extends Graph {

    // 长
    private int a=6;
    // 宽
    private int b=3;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public int getB() {
        return b;
    }

    public void setB(int b) {
        this.b = b;
    }

    @Override
    public double getArea() {
        return a*b;
    }

    @Override
    public double getPerimeter() {
        return (a+b)*2;
    }
}

Squere类
package javaclass.shapes;

/**
 * 正方形
 */
public class Squere extends Graph {

    // 边长
    private int a=8;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    @Override
    public double getArea() {
        return a*a;
    }

    @Override
    public double getPerimeter() {
        return a*4;
    }
}

Triangle类
package javaclass.shapes;

/**
 * 三角形
 */
public class Triangle extends Graph{

    // 边长
    private int sideA=6;      // 底
    private int sideB=6;      // 高
    private int sideC=6;      // 斜边

    public int getSideA() {
        return sideA;
    }

    public void setSideA(int sideA) {
        this.sideA = sideA;
    }

    public int getSideB() {
        return sideB;
    }

    public void setSideB(int sideB) {
        this.sideB = sideB;
    }

    public int getSideC() {
        return sideC;
    }

    public void setSideC(int sideC) {
        this.sideC = sideC;
    }

    /**
     * 计算三角形的面积
     * @return
     */
    @Override
    public double getArea() {
        return (sideA*sideB)/2.0;
    }

    /**
     * 计算三角形的周长
     * @return
     */
    @Override
    public double getPerimeter() {
        return (sideA+sideB+sideC)*1.0;       // 周长
    }

}

创建GraphFactory工厂类

package javaclass.shapes;

/**
 * 图形工厂模式
 */
public class GraphFactory {

    /**
     * 根据图形名称创建图形实例化对象
     *  如果图形存在直接返回创建的对象
     *  如果不存在则直接返回null
     * @param graphName
     * @return
     */
    public Graph getGraph(String graphName){
        if ("Triangle".equals(graphName)) {
            return new Triangle();
        }else if ("Rectangle".equals(graphName)){
            return new Rectangle();
        }else if ("Squere".equals(graphName)){
            return new Squere();
        }else if ("Circle".equals(graphName)){
            return new Circle();
        }else if("Ellipse".equals(graphName)){
            return new Ellipse();
        }
        return null;
    }
}

创建Blackboard类,并测试
package javaclass.shapes;

public class Blackboard {
    /**
     * 打印名为name的几何图形类的信息
     * @param name
     */
    void pring(String name){
        // 创建工厂类
        GraphFactory factory = new GraphFactory();
        // 创建图形类
        Graph graph = factory.getGraph(name);
        // 计算图形周长
        graph.setArea(graph.getArea());
        // 计算图形面积
        graph.setPerimeter(graph.getPerimeter());
        // 输出图形名称
        System.out.println("图形名称 = " + name);
        // 打印图形
        graph.printSting();
    }

    public static void main(String[] args) {
        // 实例化对象
        Blackboard blackboard = new Blackboard();
        // 打印三角形
        blackboard.pring("Triangle");
        // 打印长方形
        blackboard.pring("Rectangle");
        // 打印正方形
        blackboard.pring("Square");
        // 打印圆形
        blackboard.pring("Circle");
        // 打印椭圆形
        blackboard.pring("Ellipse");
    }
}

ShapeTest类

package javaclass.shapes;

public class ShapeTest {
    public static void main(String[] args) {
        // 创建正方形
        Graph square = new Square();
        // 计算图形周长
        square.setArea(square.getArea());
        // 计算图形面积
        square.setPerimeter(square.getPerimeter());
        // 打印属性
        System.out.println("正方形");
        square.printSting();

        // 创建长方形
        Graph rectangle = new Rectangle();
        // 计算图形周长
        rectangle.setArea(rectangle.getArea());
        // 计算图形面积
        rectangle.setPerimeter(rectangle.getPerimeter());
        // 打印属性
        System.out.println("长方形");
        rectangle.printSting();


    }
}

运行结果

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值