Java技术常用设计模式(四)--- 工厂模式
来源:互联网 发布:电脑去水印软件 编辑:程序博客网 时间:2024/05/23 16:56
一、简单工厂模式
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》
- Java技术常用设计模式(四)--- 工厂模式
- java 常用设计模式(工厂设计模式)
- Java设计模式:四、工厂模式
- java设计模式(四)—工厂模式
- Java设计模式(三—四)----工厂模式
- (四)Java设计模式之抽象工厂模式
- Java 常用的设计模式-工厂模式
- 常用Java设计模式系列(5)- 简单工厂、工厂方法模式和抽象工厂模式
- Java常用设计模式之工厂模式(Factory)
- Java常用设计模式详解(一)---工厂模式
- Java常用设计模式详解(一)---工厂模式
- JAVA常用设计模式(2)工厂模式
- JAVA常用设计模式(2)工厂模式
- Java常用设计模式(一)——工厂模式
- 设计模式(四)工厂模式-工厂方法模式
- 设计模式(四)-工厂模式-抽象工厂模式
- 设计模式(四) ---- 工厂方法模式
- 设计模式(四)简单工厂模式
- idea启动web项目 Artifact webapp: Error during artifact deployment. See server log for detail
- 手把手教你把Vim改装成一个IDE编程环境(图文)
- win7下安装svn服务器端及客户端详细步骤
- 解决启动WebLogic11g输入用户名密码问题
- 转 Merkle trees理解费解,先记下来
- Java技术常用设计模式(四)--- 工厂模式
- C. Leha and Function(Round #429 (Div. 2)
- suse linux VNC配置
- 数据结构-哈希表
- 常用数学符号的 LaTeX 表示方法
- 【Leetcode】【python】Letter Combinations of a Phone Number
- 【福利】彩虹秒赞8.0源码破解版(去域名授权) 彩虹云任务系统无任何限制
- 康托展开及其逆运算
- RabbitMQ示例生产者消费者(二)——Exchange fanout方式