1.解析
意图目的 :
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂中的创建方法使得将类的实例化的延迟到其子类,即实例化其子类.
简单说明 :
简单工厂模式是工厂模式中最简单的. 工厂类中有一个静态方法,用来接受参数,并根据参数的类型创建不同的实例.
2.实例
业务说明 :
面粉,我们可以制作不同的食物,比如饺子,面条,馒头.下面用这个实例解释下简单的工厂模式.
$. 准备原材料-面粉 , 开店面 .
(1) 实现面粉接口, 并提供制作方法, 用来制作食物
public interface MianFen {
void makeFood();
}
(2) 实现饺子类: 招聘制作饺子的大厨, 来制作饺子
public class JiaoZi implements MianFen{
@Override
public void makeFood() {
System.out.println("端饭饺子饭喽!");
}
}
(3) 实现面条类: 招聘制作面条的大厨,来制作面条
public class Noodles implements MianFen{
@Override
public void makeFood() {
System.out.println("端面条饭喽!");
}
}
(4) 实现馒头类: 招聘制作馒头的大厨, 来制作馒头
public class MaiTou implements MianFen {
@Override
public void makeFood() {
System.out.println("端馒头饭喽!");
}
}
$. 开始生产 面条 , 饺子 , 馒头 .
(5) 实现工厂类 ,用来告知那个大厨去制作食物
public class SimpleFactory {
public static final String MIANFEN_JIAOZI="jiaozi";
public static final String MIANFEN_MAITOU="maitou";
public static final String MIANFEN_NOODLES="noodles";
public static MianFen WoYao(String type){
if(type.equals(MIANFEN_JIAOZI)){
//生成饺子
return new JiaoZi();
}else if(type.equals(MIANFEN_MAITOU)){
//生成唛头
return new MaiTou();
}else if(type.equals(MIANFEN_NOODLES)){
//生成面条
return new Noodles();
}
return null;
}
}
$. 开门迎客, 用户点什么, 给用户制作什么食物
(6) 实现测试 : 用户点什么, 给用户制作什么食物
public class TestFactory {
public static void main(String[] args) {
SimpleFactory.WoYao(SimpleFactory.MIANFEN_JIAOZI).makeFood();
SimpleFactory.WoYao(SimpleFactory.MIANFEN_MAITOU).makeFood();
SimpleFactory.WoYao(SimpleFactory.MIANFEN_NOODLES).makeFood();
System.out.println("Thanks");
}
}
(7) 实例结语
通过这一实例,很简单的就可以理解简单工厂模式.在实例中,最重要的是用户点饭了(SimpleFactory类), 用户点什么饭, SimpleFactory 告知大厨做什么饭. 所以 SimpleFactory 是十分重要的存在!
结果 :
3.优缺点
优点 :
(1) 当一个类不知道他所必须创建对象的类的时候.
(2) 当一个类希望他的子类来指定的时候.
(3) 拥有必要的逻辑判断能力和创建能力.
(4) 保证代码复用,各类完全离,避免更高代码意原源代码改错.
缺点 :
(1) “高内聚”, 整个系统都依赖于SimpleFactory 类.
(2) 想增加一个产品的时候, 需要修改SimpleFactory 类.
(3) 当我们拥有很多很多产品的时候,而且产品之间又存在复杂的层次关系的时候,这个类必须拥有复杂的逻辑判断能力,其代码量也将不断地激增,这对以后的维护简直就是恐怖.
(4) 当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好.
4.用途
使用场景 :
(1) 工厂类负责创建的对象比较少;
(2) 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
(3) 由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
使用总结 :
简单工厂在你的工厂处理类型不会变动的非常频繁,而又会有变动的可能性的时候使用.
例如 :
(1) 计算器: + , - , x , / ,运算.
(2) 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方.
(3) 数据库访问类:访问可能是SQLSERVER、ORACLE等,用记可以选择创建访问不同的数据库。