设计模式之-工厂模式

定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类(抽象类)或接口。简单工厂模式又称为静态工厂方法模式,属于类的创建型模式,通常根据一个条件(参数)来返回不同的类的实例。
它由三种角色组成(关系见下面的类图):
1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,负责通过不同条件创建不同产品。
2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3、具体产品角色:工厂类所创建的对象就是此角色的实例,是简单工厂模式的创建目标。

结构图:

优点:
· 简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对 象的尴尬局面中摆脱出来。
· 外界与具体类隔离开来,偶合性低。
· 明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
-在简单工厂模式中最核心的部分—-工厂类不要根据传来的条件去动态创建产品类,利用反射机制去创建。把要实例化的类名放在应用程序配置文件中, 可以让文件更好维护。

缺点:
· 工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则
· 虽然简单工厂模式能够适应一定的变化,但是它所能解决的问题是远远有限的。它所能创建的类只能是事先就考虑到的,如果需要添加新的类,则就需要改变工厂类了。
-在添加新产品时,需要编写新的具体产品类(其实这不算一个缺点,因为这是不可避免的),要增加与之对应的具体工厂类。

应用:工厂类通过传入的参数确定实例化那种形状,形状的(具体产品)类继承自shape(抽象产品类)。

1.创建接口或抽象类:public interface Shape { void draw();}
2.创建实现接口的实体类,这些类最终会被工厂实例化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Rectangle: Shape 
{
public void draw()
  {
    System.out.println("Inside Rectangle::draw() method.");
  }
}
public class Square: Shape
{
public void draw()
  {
    System.out.println("Inside Square::draw() method.");
  }
}

3.创建工厂类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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();
}
return null;
}
}

4.通过传递类型信息创建并获取实例:
Shape shape1 = shapeFactory.getShape(“CIRCLE”);