设计模式系列参考:
http://www.cnblogs.com/Coda/p/4279688.html
一、概述
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
工厂模式可以分为三类:
1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)
二、实践
核心就是只要实现了统一接口(可以是标识性接口)(一般是实现了同一接口),把返回值(或者参数)进行抽象即可!
直接看背景代码
/**
* 动物接口
* 作者: Administrator
* 日期: 2017/10/25
**/
public interface Animal {
void run();
}
/**
* 动物实现类——小狗
* 作者: Administrator
* 日期: 2017/10/25
**/
public class Dog implements Animal{
@Override
public void run() {
System.out.println("dog run...");
}
}
/**
* 动物实现类——小猫
* 作者: Administrator
* 日期: 2017/10/25
**/
public class Cat implements Animal{
@Override
public void run() {
System.out.println("cat run...");
}
}
外部通过静态工厂方法,提供类型即可创建相关的对象!——一般都使用静态的方法,避免创建工厂的繁琐
public static Animal createAnimal(String type) {
if ("dog".equalsIgnoreCase(type)) {
return new Dog();
} else if ("cat".equalsIgnoreCase(type)) {
return new Cat();
} else {
System.out.println("找不到类型!");
return null;
}
}
// 根据阿里规范提示,这里出现了“dog”这样的魔法值!
三、改进与思考
改进为使用反射创建:
package com.roc.factory;
/**
* 简单工厂放射实现
* @author liaowp
*
*/
public class SampleFactory1 {
public static Human makeHuman(Class c){
Human human = null;
try {
human = (Human) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
System.out.println("不支持抽象类或接口");
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("没有足够权限,即不能访问私有对象");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("类不存在");
e.printStackTrace();
}
return human;
}
}
循环使用对象
简单工厂每次都是new一个新的对象,如果业务逻辑允许,可以通过类似“单例模式”中的方式,循环使用创建的对象。——但是单例并不是简单工厂的退化,它是自身的工厂,并且构造器是私有的(防止外部创建对象)
优缺点
创建与使用的责任划分;
违反“开闭原则”,难以扩展;工厂类作为“上帝类”负责了所有对象的创建,一旦工厂无法正常工作,将产生巨大影响!