设计模式-简单工厂模式,享元模式

最新学习了刘伟老师的设计模式:简单工厂模式,

史上最全设计模式导学目录(完整版)_刘伟技术博客-CSDN博客

工厂三兄弟之简单工厂模式(一)_刘伟技术博客-CSDN博客工厂三兄弟之简单工厂模式(二)_刘伟技术博客-CSDN博客工厂三兄弟之简单工厂模式(三)_刘伟技术博客-CSDN博客工厂三兄弟之简单工厂模式(四)_刘伟技术博客-CSDN博客

做一下后面的练习题

练习

使用简单工厂模式设计一个可以创建不同几何形状(如圆形、方形和三角形等)的绘图工具,每个几何图形都具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,提示一个UnSupportedShapeException。

先分析问题: 首先是有图形工具,可以创建不同形状,工具里面有两个方法,绘制daw()和擦除erase()。

首先定义一个抽象类Shape,并针对抽象类Shape定义一个工厂类ShapeFactory

package com.pattern.simplefactory;

public abstract class Shape {
    /**
     * 绘制方法
     */
    abstract void draw();

    /***
     * 擦除方法
     */
    protected void erase(){
        for (int i = 0; i < 10; i++) {
            System.out.println();
        }
    }
}

定义具体的形状

package com.pattern.simplefactory;
/**
 * 圆形
 */
public class ShapeCircular extends Shape{
    @Override
    public void draw() {
        int r=8;//圆形的半径
        for (int y = 0; y <= 2 * r; y += 2) {//y的步长为2,改变y的步长可以将圆形变成椭圆
            int x = (int)Math.round(r - Math.sqrt(2 * r * y - y * y));
            int len = 2 * (r - x);
            for (int i = 0; i <= x; i++) {
                System.out.print(' ');
            }
            System.out.print('*');
            for (int j = 0; j <= len; j++) {
                System.out.print('*');
            }
            System.out.println('*');
        }
    }
}

package com.pattern.simplefactory;
/**
 * 方形
 */
public class ShapeSquare extends Shape{
    @Override
    void draw() {
        int i = 5;
        for (int j = 0; j <= i; j++) {
            for (int k = 0; k <= i; k++) {
                System.out.print(" * ");
            }
            System.out.println();
        }
    }
}

package com.pattern.simplefactory;
/**
 * 三角形
 */
public class ShapeTriangle extends Shape{
    @Override
    void draw() {
        int i= 5;
        for (int j = 0; j <= i; j++) {
            int spea = (i-j);
            for (int k = 0; k < spea; k++) {
                System.out.print(" ");
            }
            for (int k = 0; k < j; k++) {
                System.out.print("*");
            }
            for (int k = 0; k < j-1; k++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

然后创建具体的工厂类ShapeFactory,其中如果有不支持的图形就报UnSupportedShapeException错误。:

package com.pattern.simplefactory;

import java.util.HashMap;
import java.util.Map;

/**
 * 图形工厂
 */
public class ShapeFactory {
    private static String Circular = "Circular";
    private static String Square = "Square";
    private static String Triangle = "Triangle";

    public static Shape getShape(String shapeStr){
        Shape shape = null;
        if(Circular.equals(shapeStr)){
            shape = new ShapeCircular();
        }else if(Square.equals(shapeStr)){
            shape = new ShapeSquare();
        }else if(Triangle.equals(shapeStr)){
            shape = new ShapeTriangle();
        }else{
            throw new UnSupportedShapeException();
        }
        return shape;
    }
}

最后定义一个UnSupportedShapeException类 继承RuntimeException

package com.pattern.simplefactory;

public class UnSupportedShapeException extends RuntimeException{
}

最后测试一下:

package com.pattern.simplefactory;

public class Client {
    public static void main(String[] args) {
        //打印方形
        Shape shape = ShapeFactory.getShape("Square");
        shape.draw();
        //打印三角形
        Shape shape1 = ShapeFactory.getShape("Triangle");
        shape1.draw();
        //打印圆形
        Shape shape2 = ShapeFactory.getShape("Circular");
        shape2.draw();
        //擦除
        shape2.erase();
    }
}

最后运行结果:

设计模式-简单工厂模式,享元模式_第1张图片

 然后再思考一下,在工厂里面如果多次调用同一种形状每次会new一个全新的Shape.并且每次创建的Shape本身也并没有什么差别。这里可以用享元模式的思路来做一下改善:

这里给一个享元模式入口史上最全设计模式导学目录(完整版)_刘伟技术博客-CSDN博客

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。

package com.pattern.simplefactory;

import java.util.HashMap;
import java.util.Map;

/**
 * 图形工厂
 */
public class ShapeFactory {
    private static String Circular = "Circular";
    private static String Square = "Square";
    private static String Triangle = "Triangle";
    private static Map shapeMap = new HashMap<>();

    public static Shape getShape(String shapeStr){
        Shape shape = null;
        //享元模式
        if(shapeMap.containsKey(shapeStr)){
            shape = shapeMap.get(shapeStr);
            return shape;
        }
        if(Circular.equals(shapeStr)){
            shape = new ShapeCircular();
        }else if(Square.equals(shapeStr)){
            shape = new ShapeSquare();
        }else if(Triangle.equals(shapeStr)){
            shape = new ShapeTriangle();
        }else{
            throw new UnSupportedShapeException();
        }
        shapeMap.put(shapeStr, shape);
        return shape;
    }
}

你可能感兴趣的:(简单工厂模式,享元模式,java,设计模式)