工厂模式

Posted 柯腾_wjf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式相关的知识,希望对你有一定的参考价值。

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


结构图:

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


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

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

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

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.创建工厂类:

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");

以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式-简单工厂工厂方法模式抽象工厂模式详解

C++工厂模式(简单工厂工厂方法抽象工厂)