Java技术常用设计模式(四)--- 工厂模式

一、简单工厂模式

1 简单工厂模式概述

简单工厂模式即指定一个模子,模子中定义一些方法,方法由具体的类去实现。而工厂类负责创建具体的类的对象实例。

2 简单工厂模式结构图

这里写图片描述

组成:
Product:抽象产品类,定义了产品的通用属性,相当于模子,它定义了一些功能由子类去实现;
ConcreteProduct:具体产品角色,实现了抽象产品类中的功能;
SimpleFactory:工厂模式类,负责创建具体 的产品。

3 简单工厂模式的Java代码实现

Product类:

public abstract class AbstractProduct {
    public abstract void product();
}

ConcreteProduct类:

public class ConcreteProductA extends AbstractProduct {
    @Override
    public void product() {
        System.out.println("产品A开始定制了。。。");
    }
}
public class ConcreteProductB extends AbstractProduct {
    @Override
    public void product() {
        System.out.println("产品B开始定制了。。。");
    }
}

工厂类:

public class SimpleFactory {

    public static AbstractProduct createProduct(String type){
        AbstractProduct p = null;

        switch(type){
            case "A":
                p = new ConcreteProductA();
                break;
            case "B":
                p = new ConcreteProductB();
                break;
        }
        return p;
    }
}

测试:

public class Main {

    public static void main(String[] args) {
        System.out.println("给我一个来个A产品:");
        AbstractProduct pro = SimpleFactory.createProduct("A");
        pro.product();

        System.out.println("给我一个来个B产品:");
        pro = SimpleFactory.createProduct("B");
        pro.product();
    }
}

输出:
给我一个来个A产品:
产品A开始定制了。。。
给我一个来个B产品:
产品B开始定制了。。。

4 iBatis中简单工厂模式的实现

iBatis中DataExchangeFactory类使用的就是简单工厂模式。
这里写图片描述

如图,DataExchange类就是抽象产品类,而ListDataE xchange、DomDataExchange等就是具体的产品。创建这些产品的工厂就是DataExchangeFactory。
DataExchangeFactory创建产品的代码如下:

public DataExchange getDataExchangeForClass(Class clazz){
        DataExchange dataExchange = null;
        if(clazz == null){
            dataExchange = complexDataExchange;
        } else if(DomTypeMarker.class.isAssignableFrom(clazz)){
            dataExchange = domDataExchange;
        } else if(List.class.isAssignableFrom(clazz)){
            dataExchange = listDataExchange;
        }
        ...
        else{
            dataExchange = new JavaBeanDataExchange(this);
        }
        return dataExchange;
    }

二、工厂方法模式

1 工厂方法模式概述

简单工厂模式:
优点:工厂类中含有判断逻辑,可以根据客户端的选择来动态创建哪个产品的实例;对于客户端来说去除了与具体产品的依赖;
缺点:
1)工厂类中含有复杂的产品创建逻辑判断,当逻辑判断较多时 不好维护和控制;
2)当需要添加新的产品子类时,需要在工厂类中加case 进行选择,即需要修改类,违反了开发-封闭原则。

工厂方法模式:
工厂模式与简单工厂模式类似,只是加了一个抽象工厂接口,以及为每个具体的产品加了一个具体的工厂类,即每一个具体工厂类负责生产一种产品类实例。

这样做的好处在于:
当你想要再加产品类ConcreteProductC的时候,就不需要修改简单工厂类加上case判断,而是直接加一个用来生产该新增的产品类ConcreteProductC的工厂类ProductCFactory即可。

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到子类。

2 工厂方法模式结构图

这里写图片描述

组成:
Product:抽象产品类,定义了产品的通用属性,相当于模子,它定义了一些功能由子类去实现;
ConcreteProduct:具体产品角色,实现了抽象产品类中的功能;
Factory: 抽象工厂角色,定义了所有工厂都应该具有的功能;
ConcreteFactory: 具体工厂模式类,实现了抽象工厂定义的所有功能。

3 工厂方法模式的Java代码实现

(1)象产品类及具体产品类同上:
Product类:

public abstract class AbstractProduct {
    public abstract void product();
}

ConcreteProduct类:

public class ConcreteProductA extends AbstractProduct {
    @Override
    public void product() {
        System.out.println("产品A开始定制了。。。");
    }
}
public class ConcreteProductB extends AbstractProduct {
    @Override
    public void product() {
        System.out.println("产品B开始定制了。。。");
    }
}

(2)工厂类:
抽象工厂接口 IFactory :

public interface IFactory {
    public AbstractProduct createProduct();
}

具体工厂方法模式类:

//专门用来生产A产品类实例
public class ProductAFactory implements IFactory {

    @Override
    public ConcreteProductA createProduct() {
        return new ConcreteProductA();
    }

}
//专门用来生产B产品类实例
public class ProductBFactory implements IFactory{
    @Override
    public ConcreteProductB createProduct() {
        return new ConcreteProductB();
    }
}

(3)测试:

public class Main {
    public static void main(String[] args) {
        ProductAFactory factoryA = new ProductAFactory();
        //创建A产品类实例,并开始生产A产品
        ConcreteProductA productA  = factoryA.createProduct();
        productA.product();

        ProductBFactory factoryB = new ProductBFactory();
        //创建B产品类实例,并开始生产B产品
        ConcreteProductB productB  = factoryB.createProduct();
        productB.product();
    }
}

输出:
产品A开始定制了。。。
产品B开始定制了。。。

工厂方法模式的优点在于:
每一种 产品类都有一个工厂类去负责生产;
这样当你想要再加产品类ConcreteProductC的时候,就不需要修改简单工厂类加上case判断,而是直接加一个用来生产该新增的产品类ConcreteProductC的工厂类ProductCFactory即可。

4 Spring中工厂方法模式的实现

这里写图片描述
Spring Bean的创建时典型的工厂模式。
其中BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范。
BeanFactory 有三个子类:
- ListableBeanFactory
- HierarchicalBeanFactory
- AutowireCapableBeanFactory

ListableBeanFactory 接口表示这些 Bean 是可列表的;
HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个Bean 有可能有父 Bean;
AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。


参考:
(1)http://blog.csdn.net/jason0539/article/details/45037535
(2)《深入分析Java Web》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值