简单工厂模式
不要为了套模式而使用模式。我们的目的是易维护,易扩展。
核心
工厂类,这个类含有判断逻辑,决定生成用户需要的子类,并生成相应对象实例返回给用户使用。
好处
简单工厂模式的好处是可以将产品对象的细节封装在其实现类的内部,改变一个产品对象具体实现不会影响其他产品。可扩展性强,当需要新增产品类型时,只需要添加对应的实现类,然后修改工厂,增加一个判断分支即可。修改工厂函数带来的风险比较低,我们保留了对子类随时删减的权利 ,使用者不需要了解我们有什么子类。而客户端则可以免除直接创建产品对象的责任,而仅仅负责‘消费’产品。简单工厂模式通过这种做法实现了对责任的分割。
坏处
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;只适用于简单的业务情况。这样全部的判断集中在工厂类中也不好维护。
例子
定义接口--抽象产品
public interface Shape
{ void draw();
}
创建实现接口的实体类--具体产品类
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
创建一个工厂类--取决于条件的给予,返回不同的实例。
public class ShapeFactory {
//使用 getShape 方法获取形状类型的对象
public Shape getShape(String shapeType){
if(shapeType == null)
{ return null; }
if(shapeType.equalsIgnoreCase("CIRCLE"))
{return new Circle(); }
else if(shapeType.equalsIgnoreCase("RECTANGLE"))
{return new Rectangle(); }
else if(shapeType.equalsIgnoreCase("SQUARE"))
{return new Square(); }
return null;
}
}
使用工厂,通过传递类型信息来获取实体类的对象。
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
//获取 Circle 的对象,并调用它的 draw 方法 这里向上转型
Shape shape1 = shapeFactory.getShape("CIRCLE");
//调用 Circle 的 draw 方法
shape1.draw();
//获取 Rectangle 的对象,并调用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//调用 Rectangle 的 draw 方法
shape2.draw();
//获取 Square 的对象,并调用它的 draw 方法
Shape shape3 = shapeFactory.getShape("SQUARE");
//调用 Square 的 draw 方法 shape3.draw();
}
}
输出
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
例子来源[http://www.runoob.com/design-pattern/factory-pattern.html]