Java设计模式 之 工厂方法模式
1. 使用设计模式的好处:可提高代码的重复性,让代码更容易被他人理解,保证代码的可靠性。
2. 工厂模式定义:就是创建一个工厂类来创建你需要的类,工厂模式包括工厂模式和抽象工厂模式,抽象工厂模式是工厂模式的扩展。
3. 工厂模式意图:定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化,工厂方法把实例化工作推迟到子类中去实现。
4. 工厂方法适合场景:
<1>. 有一组类似的对象需要创建
<2>. 在编码时不能预见需要创建哪种类的实例
<3>. 系统需要考虑扩展性,不应依赖产品类实例如何被创建、组合和表达的细节
5. 工厂方法类图:
代码实现,举个例子,以一汽大众汽车工厂为例,大家都知道,一汽大众可生产多款汽车,有速腾、高尔夫、CC、宝来等等,我们就是使用工厂来创建不同款式的汽车。
<1>. 创建汽车接口,该接口就有一个生产汽车抽象。
package com.dasauto.car; /**
* 一汽大众汽车接口
* @author DuanCZ
*/ public interface ICar { /**
* 生产汽车
*/
public void createCar(); }
<2>. 创建速腾汽车实现类,该类实现汽车接口
package com.dasauto.car;
public class SagitarCar implements ICar {
/**
* 生产速腾汽车
*/
public void createCar() {
System.out.println("-----------生产一台速腾汽车---------");
}
}
<3>,创建高尔夫汽车实现类,该类实现汽车接口
package com.dasauto.car;
public class GolfCar implements ICar {
/**
* 生产高尔夫汽车
*/
public void createCar() {
System.out.println("----------创建一台高尔夫汽车----------");
}
}
<4>, 创建汽车工厂类,该类将根据不同款式的汽车类名称来实例化对象
package com.dasauto.car;
public class CarFactory {
/**
* 根据类名称去创建汽车对象
* @param className
* @return
*/
public ICar getCar(String className){
try {
ICar car = (ICar) Class.forName(className).newInstance();
return car;
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
<5>, 模拟客户端,测试
package com.dasauto.car;
public class CarClient {
public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
ICar car = carFactory.getCar("com.dasauto.car.SagitarCar");
car.createCar();
}
}
工厂方法模式很简单,就是单一的一种产品,这不同汽车类名称可以配置到xml中去,如果以后多了一种汽车,那么就是编写好实现类后,配置个XML文件,这样客户端就可以很简单的应用了。
6. 抽象工厂方法类图
相比工厂方法模式,抽象工厂就复杂一些了,它有产品族的概念,也就是说不是生产单一产品了,而是生产一系列产品。
代码实现,例如我们做一款程序,程序可能使用多种不同的数据库来完成数据持久化操作。下面是根据模型模拟代码
<1>,
package com.dcz.demo; /**
* 抽象产品A
* @author DuanCZ
*/ public interface IProductA { public void method_1(); public void method_2(); }
<2>,
package com.dcz.demo; /**
* 抽象产品B
* @author DuanCZ
*/
public interface IProductB { public void method_1(); public void method_2(); }
<3>,
package com.dcz.demo;
public interface IAbstractFactory {
public IProductA productA();
public IProductB productB();
}
<4>,
package com.dcz.demo;
public class concretenessProductA1 implements IProductA {
@Override
public void method_1() {
System.out.println("生产等级为1的A类Method_1");
}
@Override
public void method_2() {
System.out.println("生产等级为1的A类Method_2");
}
}
<5>,
package com.dcz.demo;
public class concretenessProductA2 implements IProductA {
@Override
public void method_1() {
System.out.println("生产等级为2的A类Method_1");
}
@Override
public void method_2() {
System.out.println("生产等级为2的A类Method_2");
}
}
<6>,
package com.dcz.demo;
public class concretenessProductB1 implements IProductB {
@Override
public void method_1() {
System.out.println("生产等级为1的B类Method_1");
}
@Override
public void method_2() {
System.out.println("生产等级为1的B类Method_2");
}
}
<7>,
package com.dcz.demo;
public class concretenessProductB2 implements IProductB {
@Override
public void method_1() {
System.out.println("生产等级为2的B类Method_1");
}
@Override
public void method_2() {
System.out.println("生产等级为2的B类Method_2");
}
}
package com.dcz.demo;
public class ConcreateFactory1 implements IAbstractFactory {
public IProductA productA() {
return new concretenessProductA1();
}
public IProductB productB() {
return new concretenessProductB1();
}
}
package com.dcz.demo;
public class ConcreateFactory2 implements IAbstractFactory {
@Override
public IProductA productA() {
return new concretenessProductA2();
}
@Override
public IProductB productB() {
return new concretenessProductB2();
}
}
package com.dcz.demo;
public class Client {
public static void main(String[] args) {
IAbstractFactory concreateFactory1 = new ConcreateFactory1();
IProductA productA = concreateFactory1.productA();
productA.method_1();
productA.method_2();
}
}
Java设计模式 之 工厂方法模式的更多相关文章
- Java设计模式之工厂方法模式(转) 实现是抽象工厂?
Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织 2009-02-25 来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章] ...
- Java设计模式系列-工厂方法模式
原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...
- java设计模式(二)---工厂方法模式
2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...
- JAVA设计模式之工厂方法模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...
- Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)
1 概念定义 1.1 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2 类型 创建类模式 2 原理特征 2.1 类 ...
- 【java】 java 设计模式(1):工厂方法模式(Factory Method)
工厂方法模式分为三种: 1.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图: 举例如下:(我们举一个发送邮件和短信的例子) 首先,创建二者的共同接口: p ...
- java设计模式学习 ----- 工厂方法模式(Factory Method)
工厂方法模式(Factory Method) 工厂方法模式分为三种:普通工厂模式.多个工厂方法模式.静态工厂方法模式 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 关系图 ...
- Java设计模式(2)——工厂方法模式
工厂方法模式同样属于类的创建型模式又被称为多态工厂模式.工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色, ...
- C#设计模式(3)——工厂方法模式
一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...
随机推荐
- POJ3208:Apocalypse Someday
传送门 很神奇的一道题,正解是AC自动机+数位DP,个人感觉POPOQQQ大爷的方法更方便理解. 按照一般套路,先搞个DP预处理,设$f[i][0/1/2/3]$分别表示对于$i$位数,其中有多少个前 ...
- Pyhton 单行、多行注释符号使用方法及规范
一.单行注释符号 # 用作单行注释符号. print 1 #输出1 二.多行注释符号 多行注释是用三引号''' '''包含. ''' 用于解析所有从网页上保存下来的页面(html) ...
- linux第一面
随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.作为一个 Linux系统管理员,我看了许多有关Linux的文档和书籍,并为学习 ...
- springmvc 注解 配置文件解释
概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...
- C#--几个数据流Stream;StreamReader;StreamWriter;MemoryStream;BufferStream;
命名空间:System.IO; Stream: 各种流的基类,不能时行查找操作,Position属性不能修改.读取时不Position不会自动移动, HttpWebRequest webreq = ( ...
- $().index() 两种用法
第一种:获得第一个 p 元素的名称和值: $(this).index() <script type="text/javascript"> $(document).rea ...
- cad中关于点样式点的绘制
点样式 从0开始, 默认的就是0 0= 一个小点; 1= 空的, 什么都不显示; 2= +加号; 3= X 叉号 设置点样式的命令是: pdmode: 可以假设认为是: point default m ...
- hdu5033 Building (单调栈+)
http://acm.hdu.edu.cn/showproblem.php?pid=5033 2014 ACM/ICPC Asia Regional Beijing Online B 1002 Bui ...
- PHP+MySQL存储数据出现中文乱码的问题
PHP+MySQL出现中文乱码的原因: 1. MYSQL数据库的编码是utf8,与PHP网页的编码格式不一致,就会造成MYSQL中的中文乱码. 2. 使用MYSQL中创建表.或者选择字段时设置的类型不 ...
- jQuery.validator 详解二
前言:上一篇详细的介绍了jQuery.validator( 版本v1.13.0 )的验证规则,这一篇重点讲述它的源码结构,及如何来对元素进行验证,错误消息提示的内部实现 一.插件结构(组织方式) 在讲 ...