简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
创建实例的方法都是静态方法,因此简单工厂模式也称为静态工厂方法模式。
Java语言创建对象的方式:
使用new关键字直接创建对象;通过反射机制创建对象;通过克隆方法创建对象;通过工厂类创建对象。1、实现了对象创建和使用的分离; 2、客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可; 3、通过引入配置文件,可以在不修改任何客户端代码的情况下更换的增加新的具体产品类,在一定程度上提高了系统的灵活性。
缺点1、工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响; 2、增加了系统中类的个数且增加了系统的复杂度和理解难度; 3、系统扩展困难,一旦添加新产品就不得不修改工厂逻辑且工厂角色无法形成基于继承的等级制度。
1、题目:
使用简单工厂模式设计一个可以创建不同几何形状(Shape)的绘图工具类,例如圆形(Circle)、矩形(Rectangle)和三角形(Triangle)等,每个几何图形均具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时抛出一个UnsupportedShapeException异常,使用Java语言实现。
2、实现代码: (1)、Shape:抽象绘图工具接口,充当抽象产品类
package simpleFactoryPattern; public interface Shape { public void draw(); public void erase(); }(2)、CircleShape:圆形类,充当具体产品类。
package simpleFactoryPattern; public class CircleShape implements Shape { public CircleShape() { System.out.println("创建圆形"); } public void draw() { System.out.println("画出圆形"); } public void erase() { System.out.println("擦除圆形"); } }(3)、RectangleShape:矩形类,充当具体产品类。
package simpleFactoryPattern; public class RectangleShape implements Shape { public RectangleShape() { System.out.println("创建矩形"); } public void draw() { System.out.println("画出矩形"); } public void erase() { System.out.println("擦除矩形"); } }(4)、TriangleShape:三角形类,充当具体产品类。
package simpleFactoryPattern; public class TriangleShape implements Shape { public TriangleShape() { System.out.println("创建三角形"); } public void draw() { System.out.println("画出三角形"); } public void erase() { System.out.println("擦除三角形"); } }(5)、ShapeFactory:绘图工具工厂类,充当工厂类。
package simpleFactoryPattern; public class ShapeFactory { // 静态工厂方法 public static Shape getShape(String type) { Shape shape = null; if (type.contentEquals("circle")) { shape = new CircleShape(); System.out.println("初始化圆形"); }else if (type.contentEquals("rectangle")) { shape = new RectangleShape(); System.out.println("初始化矩形"); }else if (type.contentEquals("triangle")) { shape = new TriangleShape(); System.out.println("初始化三角形"); } return shape; } }(6)、Client:客户端测试类。
package simpleFactoryPattern; public class Client { public static void main(String[] args) { Shape shape; shape = ShapeFactory.getShape("circle");// 通过静态方法创建产品 shape.draw(); shape.erase(); } }上面的实例可以说完成了,但是还是有点不足,修改客户端中的参数来更换具体产品对象,客户端代码需要重新编译,这对客户端而言违反了开闭原则。这个问题是由解决方案的,就是使用配置文件的方式,详细过程就不陈述 了。
如有不妥之处欢迎评论,相互学习,谢谢。