bacor

个人站

Coding is important, so is writing


工厂模式

工厂模式是一个很常用的设计模式,在项目中经常能见到它的身影。工厂模式常被用作解耦。

应用场景

与数据库打交道时,我们使用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);
    }
}

工厂方法的优点

  1. 对代码进行封装,降低模块间的耦合性
  2. 拓展方便

简单工厂模式

在一些简单的情况下,我们不需要多个工厂类,这时把抽象工厂类去掉显得更为简单,同时把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();
    }
}

参考

《设计模式之禅》 工厂模式(菜鸟教程)