首先学习创建模式,其中工厂模式是创建模式里面最常见也常用的一种,工厂模式又分简单工厂模式(Simple Factory),工厂方法模式(Factory Method)和抽象工厂模式(Abstractor Factory),这里先学习最简单的也就是简单工厂模式。
简单工厂模式(Simple Factory)也称静态工厂方法模式,是工厂方法模式的特殊实现。简单工厂模式的一般性结构如下图:
简单工厂模式就是由一个工厂类根据传入的参量决定创建出哪一种产品类型的实例,下面我们拿实例来介绍简单工厂模式。如下图,抽象类型车包括子类火车,汽车,拖拉机。
工厂根据传入的参数来创建具体车的类型。上图中无法形象地表示抽象类所以用接口代替了。
java代码如下:
package com.pattern.SimpleFactory;
/**
*
*【描述】:工厂类
*/
public class Factory {
public TrafficMachine creator(String type) throws TypeErrorException{
if(type.equals("Automobile")){
return new Automobile();
}else if (type.equals("Tractor")) {
return new Tractor();
}else if (type.equals("Train")) {
return new Train();
}else{
throw new TypeErrorException("not find "+type);
}
}
}
package com.pattern.SimpleFactory;
/**
*
*【描述】:汽车类
*
*/
public class Automobile extends TrafficMachine{
@Override
public void traffic() {
// TODO Auto-generated method stub
}
}
package com.pattern.SimpleFactory;
/**
*
*【描述】:拖拉机
*
*/
public class Tractor extends TrafficMachine{
@Override
public void traffic() {
// TODO Auto-generated method stub
}
/**
*
*【描述】:耕地
*/
public void plough(){
}
}
package com.pattern.SimpleFactory;
/**
*
*【描述】:火车
*
*/
public class Train extends TrafficMachine {
private int nodeNum; //节数
private int trainNum; //车次
@Override
public void traffic() {
// TODO Auto-generated method stub
}
public int getNodeNum() {
return nodeNum;
}
public void setNodeNum(int nodeNum) {
this.nodeNum = nodeNum;
}
public int getTrainNum() {
return trainNum;
}
public void setTrainNum(int trainNum) {
this.trainNum = trainNum;
}
}
package com.pattern.SimpleFactory;
/**
*
*【描述】:抽象类 车
*
*/
public abstract class TrafficMachine {
public float power ;
public float load ;
public abstract void traffic();
}
package com.pattern.SimpleFactory;
/**
*
*【描述】:类型异常类
*
*/
public class TypeErrorException extends Exception{
private static final long serialVersionUID = 562037380358960152L;
public TypeErrorException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}
通过以上分析及其代码列举可知,简单工厂类的构造有三种角色,它们分别是工厂角色,抽象产品角色和具体产品角色。工厂类的创建方法根据传入的参数来判断实例化那个具体的产品实例。
工厂类角色:这个角色是工厂方法模式的核心,含有与应用紧密相连的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体的java类来实现。
抽象产品角色:担当这个角色的是一个java接口或者java抽象类来实现。往往是工厂产生具体类的父类。
具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品往往就是一个具体的java类来承担。
简单工厂模式优缺点
优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
简单工厂模式的使用场景
(1)、工厂类负责创建的对象比较少;
(2)、客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
(3)、由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。