简单工厂模式
2020-06-22 本文已影响0人
nieniemin
什么是简单工厂模式
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
模式角色
- 工厂角色(Factory):主要负责创建具体的实例。
2.抽象实体角色(Shape):简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.具体实现角色(Circle,Square):所有由工厂角色创建出来的实例都是具体实现。
UML类图
简单工厂模式代码实现
// 抽象实体角色
public abstract class Shape extends Factory {
public abstract void draw();
}
// .具体实现角色Circle
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("Circle::draw() method.");
}
}
// .具体实现角色Square
public class Square extends Shape {
@Override
public void draw() {
System.out.println("Square::draw() method.");
}
}
// 工厂角色
public class Factory {
public Shape getShape(String shapeType) {
if (shapeType.equalsIgnoreCase("circle")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("square")) {
return new Square();
}
return null;
}
/**
* 反射
*
* @param cla
* @return
*/
public Shape getShape(Class cla) {
Shape iShape = null;
try {
iShape = (Shape)cla.asSubclass(Shape.class).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return iShape;
}
}
public class TestFactory {
public static void main(String[] args) {
Factory factory = new Factory();
// 方法-1
Shape circle = factory.getShape("circle");
circle.draw(); // 1 输出结果:Circle::draw() method.
Shape square = factory.getShape("square");
square.draw(); // 2 Square::draw() method.
// 反射方法-2
Shape shapeCircle = factory.getShape(Circle.class);
shapeCircle.draw(); // 3 输出结果:Circle::draw() method.
Shape shapeSquare = factory.getShape(Square.class);
shapeSquare.draw(); // 4 Square::draw() method.
}
}
优点
通过代码可以看到,调用者想创建一个对象,只要知道其名称就可以了不需要再new Circle,new Square,new Rectangle ... 屏蔽了产品的具体实现,调用者只关心产品的接口即可。
缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。如果用方法1实现的话明显不符合设计模式的开闭原则。