工厂模式是一个很常用的设计模式,在项目中经常能见到它的身影。工厂模式常被用作解耦。
应用场景
与数据库打交道时,我们使用JDBC隔离了数据库的具体实现,当从MYSQL切换到Oracle时只需修改驱动名称;
在Android开发中,BitmapFactory也是工厂模式的典型案例,我们可以使用这个工厂类解析多种资源返回bitmap对象。
定义
UML图
UML图中,Product为抽象产品类,提供事物的抽象定义,ConcreteProduct为Product的具体实现,工厂方法返回的也是这些类的对象。Create为抽象创建类,,具体创建工作由它的具体实现类ConcreteCreator完成。一般来说代码模板如下:
实现
抽象产品类,对具体产品的抽象
public abstract class Product {
//抽象方法
public abstract void method1();
}
具体产品类
public class ConcreteProduct1 extends Product {
@Override
public void method1() {
//业务逻辑
}
}
抽象工厂类
public abstract class Creator {
public abstract <T extends Product> T createProduct(Class<T> c);
}
具体工厂类
public class ConcreteCreator extends Creator {
@Override
public <T extends Product> T createProduct(Class<T> c){
Product product = null;
try {
//返回类的实例
product = (Product) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) product;
}
//或者也可以这样创建具体实例,当然也有其他方式,目的都是返回具体产品实例
public Product createProduct(int type){
switch(type){
case 1:
//在这里返回具体产品实例
return new ConcreteProduct1();
default:
return null;
}
}
使用
public class Client {
public static void main(String[] args) {
ConcreteCreator creator = new ConcreteCreator();
//获得产品
Product product = creator.createProduct(ConcreteProduct1.class);
}
}
工厂方法的优点
- 对代码进行封装,降低模块间的耦合性
- 拓展方便
简单工厂模式
在一些简单的情况下,我们不需要多个工厂类,这时把抽象工厂类去掉显得更为简单,同时把create方法改为静态类型,使方法调用更为简便。 为了达到这个目的我们只需简单修改上面的ConcreteCreator类,并在调用处进行相应修改即可,这里不再贴出相应代码。
抽象工厂模式
抽象工厂与上面讲到的工厂差不多。如果把上面工厂模式UML图的产品再写多几个,则会变成

可以看出这算是工厂模式的一种拓展,以前只能生产一种抽象产品的子类产品,现在可以生产多种抽象产品了。
应用场景
抽象工厂的特点是可以生产多个产品族,比工厂模式抽象等级更高一层。在实际应用中可以生产多个操作系统的程序,也可以为应用换皮肤
实现
public abstract class AbstractProductA {
public abstract void methodA();
}
public class ProductA1 extends AbstractProductA{
@Override
public void methodA() {
//业务逻辑
}
}
public class ProductA2 extends AbstractProductA{
@Override
public void methodA() {
//业务逻辑
}
public abstract class AbstractProductB {
public abstract void methodB();
}
public class ProductB1 extends AbstractProductB{
@Override
public void methodB() {
//业务逻辑
}
}
public class ProductB2 extends AbstractProductB{
@Override
public void methodB() {
//业务逻辑
}
}
public abstract class AbstractFactory {
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProductB();
}
public class Factory1 extends AbstractFactory {
//返回等级为1的产品
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
//返回等级为1的产品
@Override
public AbstractProductB createProductB() {
return new ProductB1();
}
}
public class Factory2 extends AbstractFactory {
//返回等级为2的产品
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
//返回等级为2的产品
@Override
public AbstractProductB createProductB() {
return new ProductB2();
}
}
参考
《设计模式之禅》 工厂模式(菜鸟教程)