全国电子网站建设,小蜜蜂网站建设,网站建设编辑工作总结,品牌建设与营销管理最新学习了刘伟老师的设计模式#xff1a;简单工厂模式#xff0c;
史上最全设计模式导学目录#xff08;完整版#xff09;_刘伟技术博客-CSDN博客
工厂三兄弟之简单工厂模式#xff08;一#xff09;_刘伟技术博客-CSDN博客工厂三兄弟之简单工厂模式#xff08;二简单工厂模式
史上最全设计模式导学目录完整版_刘伟技术博客-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{Overridepublic void draw() {int r8;//圆形的半径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{Overridevoid 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{Overridevoid 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();}
}最后运行结果 然后再思考一下在工厂里面如果多次调用同一种形状每次会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 MapString,Shape 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;}
}