定义
简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
创建实例的方法都是静态方法,因此简单工厂模式也称为静态工厂方法模式。
结构
- Factory(工厂角色):核心;负责创建所有实例的内部逻辑。
- Product(抽象产品角色):具体产品类的父类,里面封装了产品对象的公共方法。
- ConcreteProduct(具体产品角色):工厂类创建的对象都充当着这个角色的某个具体类的实例,并且继承抽象产品角色。
实现
- 抽象产品类
public abstract class Product { // 所有产品类的公共业务方法 public void methodSame() { // 公共方法的实现 } // 声明抽线业务方法 public abstract void methodDiff(); } ```
- 具体产品类
public class ConcreteProduct extends Product { // 实现业务方法 public void methodDiff(){ // 业务方法的实现 } }
- 核心:工厂类
public class Factory { // 静态工厂方法 public static Product getProduct(String age) { Product product = null; if (age.equalsIgnoreCase("A")) { product = new ConcreteProducr(); }else if (age.equalsIgnoreCase("B")) { product = new ConcreteProducr(); } return product; } }
创建对象和使用对象
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();
}
}
上面的实例可以说完成了,但是还是有点不足,修改客户端中的参数来更换具体产品对象,客户端代码需要重新编译,这对客户端而言违反了开闭原则。这个问题是由解决方案的,就是使用配置文件的方式,详细过程就不陈述 了。
如有不妥之处欢迎评论,相互学习,谢谢。