工厂模式
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");
以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )