这周因工作关系,进行了人生真正意义的第一次出差,真正体会到凌晨两三点还在工作的滋味。辛苦与好的结果并存!
这次出差,闲暇之余,也算被有所打击,自认对开源项目Spring、Spring Mvc 看过的人,竟被闲暇聊到时却不知从何说起,也许是自己知识还没系统化吧?比如:Spring Bean 是如何加载的?Spring Mvc 的原理,说实话,真心不能立马回答,鉴于此,相关源码系统化总结也列入计划,以此勉励自己不断进步!!
今天主要分享个人学习设计模式之--简单工厂、工厂、抽象工厂相关总结和经验:
简单工厂模式、工厂模式、抽象工厂模式(属于创建型模式)
1、简单工厂模式 (SimpleFactory.java)
特点:
(1)、一个具体的类,非接口或抽象类
(2)、有一个创建对象的方法:create()
(3)、利用if...else/switch 创建所需的对象
步骤:
(1)、定义一个接口
(2)、让子类实现接口
(3)、创建工厂
思考:增加一个接口实现,需要改动简单工厂的创建,有什么方法不需要改变呢?(工厂模式)
主要类如下,相关学习项目:https://github.com/lihua20103181/design-patterns.git
/**
* 简单工厂模式
* @author T-lih
*/
public class SimpleFactory {
public static final String BIG_CAR = "bigCar";
public static final String SMALL_CAR = "smallCar";
public static ICar create(String type) {
ICar iCar = null;
switch (type) {
case BIG_CAR:
iCar = new BigCar();
break;
case SMALL_CAR:
iCar = new SmallCar();
break;
default:
break;
}
return iCar;
}
public static void main(String[] args) {
ICar iCar = SimpleFactory.create(BIG_CAR);
}
}
2、工厂模式(AbstractFactory.java)
当需要一个类的子类实例,并且不希望与该类的子类形成耦合或者不知道该类有哪些子类可用时,可使用工厂模式。
特点:
(1)、将简单工厂划分为两层:抽象工厂层和具体子类工厂
(2)、使用多态创建工厂
主要应用场景:
二次开发和维护,当需求发生变化时,只需要删除增加相应的类,而不需要修改已有的类
/**
* 抽象工厂
* @author T-lih
*/
public abstract class AbstractFactory {
public abstract ICar create();
}
public class FactoryTest {
public static void main(String[] args) {
// 多态创建工厂
AbstractFactory abstractFactory = new BigCarFactory();
ICar iCar = abstractFactory.create();
}
}
3、抽象工厂模式(AbstractFactory2.java)
当需要提供多个对象,并且希望和创建对象的类解耦时,可用抽象工厂模式
从本质上来说,抽象工厂和工厂模式是统一的,只不过抽象工厂是多产品系的,而工厂模式是单产品系的。
public abstract class AbstractFactory2 extends AbstractFactory {
public abstract IBus create2();
}
4、使用反射+泛型创建工厂?(CommAbstractFactory.java)
/**
* 反射实现工厂
* @author T-lih
*/
public abstract class AbstractFactoryByReflect {
public abstract ICar create();
static AbstractFactoryByReflect create(String className) {
AbstractFactoryByReflect factory = null;
try {
Class clazz = Class.forName(className);
factory = (AbstractFactoryByReflect) clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return factory;
}
}
/**
* 泛型+反射实现通用工厂
* @author T-lih
* @param
*/
public class CommAbstractFactory {
public T create(String className) {
T t = null;
try {
Class clazz = Class.forName(className);
t = (T)clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
}
完续......