简单工厂模式(simpleFactory),简单来说就是一个工厂类创建某一类型的类的实例,可以是动态的、选择的创建同一类型的实例。
《java与模式》这样对简单工厂模式进行描述的,简单工厂模式设计到工厂角色、抽象产品角色三个角色。
1. 工厂类(creator)角色:担任这个角色的是工厂方法模式的核心,还有与应用紧密相关的商业逻辑。
2.抽象产品角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
3.具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色有一个具体的java类实现.
类图如下:
编写的一个简单工厂模式的例子如下:
1.TransportMachine接口
package com.design.simplefactory;
/**
*
*交通工具特征的抽象
*在类型的等级结构里面,共同的代码应当尽量向上移动(可以是抽象类),以达到共享的目的。
*/
public interface TransportMachine{
public String getName();
public String setName(String name);
public double getSpeed();
public String getKind();
public void setKind(String kind);
public int getBearNum();
public boolean isRunable();
public void setRunable(boolean runable);
}
2.AutoMobile类(TransportMachine的实现者)
package com.design.simplefactory;
/**
* 交通工具的简单实现者
* 汽车类
*
*/
public class AutoMobile implements TransportMachine{
private String carName = "";
private int carBearNum = 0;
private String vehicleKind = null;
private double speed = 0;
private boolean runable = false;
@Override
public int getBearNum() {
return this.carBearNum;
}
@Override
public String getKind() {
return this.vehicleKind;
}
@Override
public String getName() {
return this.carName;
}
@Override
public String setName(String name) {
return this.carName = name;
}
@Override
public double getSpeed() {
return this.speed;
}
@Override
public boolean isRunable() {
return this.runable;
}
@Override
public void setKind(String kind) {
this.vehicleKind = kind;
}
public void setRunable(boolean runable) {
this.runable = runable;
}
}
3.TransportManager(TransportMachine的实例creator)
package com.design.simplefactory;
/**
*
*交通工具管理者
*客户端程序向TransportManager请求所需的交通工具
*/
public class TransportManager {
public static TransportMachine getVehicle(String vehicleKind, int bearNum){
/*
* TransportMachine类起到一个管理者作用,不应该直接
* 使用new AutoMobile()操作,应该从数据库获取客户端请求的交通工具类型数据
* 或从一个HashTable中获取数据
*/
/*
* 但代码这样编写,依然是硬编码,无法具有灵活性,只有一个一个的if判断。
* spring框架使用的是从XML读取相应的bean或由注解中标注,这样一定程度上可以提高灵活性和插入性。
*/
/*
* 简单工厂模式提供某一类型的实例,这一类型可以是接口,抽象类,(或者具体的类),
*/
if ("AutoMobile".equals(vehicleKind) && bearNum == 0) {
return new AutoMobile();
}
return null;
}
}