首页 > 编程知识 正文

什么是简单工厂模式,设计模式可乐工厂模式

时间:2023-05-06 16:01:52 阅读:167754 作者:2973

最新学习了zjdxtd老师的设计模式。 是简单的工厂模型。

史上最完整的设计模式指南目录(完整版) _zjdxtd技术博客-CSDN博客

工厂三兄弟简单工厂模式(一) zjdxtd技术博客-CSDN博客工厂三兄弟简单工厂模式(二) zjdxtd技术博客-CSDN博客工厂三兄弟简单工厂模式(三) _zjdxtd技术博客-CSDN博客

请做下一道习题

练习

使用简单的factory模式设计绘图工具,可以创建各种几何图形,如圆、四边形和三角形。 每个几何体都有一种绘制draw ()和一种拭除erase ()的方法,在绘制不支持的几何体时必须提示UnSupportedShapeException。

首先分析问题。 首先有图形工具,可以做不同的形状。 工具中有两种方法。 daw () )和擦除erase ) )。

首先定义抽象类Shape,然后为抽象类Shape定义工厂类ShapeFactory

package com.pattern.simple factory; public abstract class Shape { /** *绘制方法*/abstract void draw (; /*** *清除方法*/protected void erase () ) for(intI=0; i 10; I ) { System.out.println (; }}定义具体形状

package com.pattern.simple factory; /** *圆形*/publicclassshapecircularextendsshape { @ overridepublicvoiddraw () } { intr=8; //圆形半径for(inty=0; y=2 * r; y =2) )/y的步长大小为2,通过改变y的步长大小使圆形成为椭圆intx=(int ) math.round (r-math.sqrt (2* r * y-y * y ) ) ) for(intI=0; i=x; I ) { System.out.print (' ); }system.out.print('* ' ); for(intj=0; j=len; j () system.out.print('* ' ); }system.out.println('* ' ); } } package com.pattern.simple factory; /** *正方形*/publicclassshapesquareextendsshape { @ overridevoiddraw () ({ int i=5; for(intj=0; j=i; j ) for(intk=0; k=i; k () system.out.print('* ); } System.out.println (; } } package com.pattern.simple factory; /** *三角形*/publicclassshapetriangleextendsshape { @ overridevoiddraw () } { inti=5; for(intj=0; j=i; j({intspea=(I-j ) ); for(intk=0; k spea; k ) { System.out.print (' ); }for(intk=0; k j; k () system.out.print('* ); }for(intk=0; k j-1; k () system.out.print('* ); } System.out.println (; }}然后创建具体的工厂类ShapeFactory,如果其中有不支持的图形,则向UnSu报告

pportedShapeException错误。:

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本身也并没有什么差别。这里可以用享元模式的思路来做一下改善:

这里给一个享元模式入口史上最全设计模式导学目录(完整版)_zjdxtd技术博客-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<String,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; }}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。