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");
} }
<8>,
package com.dcz.demo;

public class ConcreateFactory1 implements IAbstractFactory {

	public IProductA productA() {
return new concretenessProductA1();
} public IProductB productB() {
return new concretenessProductB1();
} }
<9>,
package com.dcz.demo;

public class ConcreateFactory2 implements IAbstractFactory {

	@Override
public IProductA productA() {
return new concretenessProductA2();
} @Override
public IProductB productB() {
return new concretenessProductB2();
} }

<10>,
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设计模式 之 工厂方法模式的更多相关文章

  1. Java设计模式之工厂方法模式(转) 实现是抽象工厂?

    Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站   文本Tag: 设计模式 Java [IT168 技术文章]         ...

  2. Java设计模式系列-工厂方法模式

    原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...

  3. java设计模式(二)---工厂方法模式

    2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...

  4. JAVA设计模式之工厂方法模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...

  5. Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)

    1     概念定义 1.1   定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2   类型 创建类模式 2     原理特征 2.1   类 ...

  6. 【java】 java 设计模式(1):工厂方法模式(Factory Method)

    工厂方法模式分为三种: 1.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图: 举例如下:(我们举一个发送邮件和短信的例子) 首先,创建二者的共同接口:   p ...

  7. java设计模式学习 ----- 工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) 工厂方法模式分为三种:普通工厂模式.多个工厂方法模式.静态工厂方法模式 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 关系图 ...

  8. Java设计模式(2)——工厂方法模式

    工厂方法模式同样属于类的创建型模式又被称为多态工厂模式.工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色, ...

  9. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

随机推荐

  1. POJ3468A Simple Problem with Integers(区间加数求和 + 线段树)

    题目链接 题意:两种操作:一是指定区间的数全都加上一个数,二是统计指定区间的和 参考斌神的代码 #include <iostream> #include <cstring> # ...

  2. javascript之标识(zhi)符、关键字与保留字

    正确区分标识(zhi)符.关键字与保留字 我发现很多初学者往往弄不清楚这三者的区别,甚至会把标识符的“识(zhi)”读作识(shi),真是愧对小学的语文老师啊!!! 注意:在JavaScript中,所 ...

  3. mongo&node

    /////  node install $ sudo apt-get install python-software-properties $ curl -sL https://deb.nodesou ...

  4. ObjectInputStream类和ObjectInputStream类的使用

    版权声明:本文为博主原创文章,未经博主允许不得转载. ObjectInputStream和ObjectInputStream类创建的对象被称为对象输入流和对象输出流. 创建文件输出流代码: FileO ...

  5. 自然语言16_Chunking with NLTK

    Chunking with NLTK 对chunk分类数据结构可以图形化输出,用于分析英语句子主干结构 # -*- coding: utf-8 -*-"""Created ...

  6. PHP 弹出文件下载

    /** * @author default7<default7@zbphp.com> * @description 演示PHP弹出下载的原理 * * @param $file_name * ...

  7. 如何在命令行模式下查看Python帮助文档---dir、help、__doc__

    如何在命令行模式下查看Python帮助文档---dir.help.__doc__ 1.dir函数式可以查看对象的属性,使用方法很简单,举str类型为例,在Python命令窗口输入 dir(str) 即 ...

  8. Markdown常用用法

    很早之前就听过Markdown,一直没用,用过才发现,原来这么好用,迷人,就好比一位知性.大方.成熟.美丽的少妇一样深深吸引着我,特深夜把学习的笔记记录下. 引用 ">"最好 ...

  9. MONO加载DLL调试命令

    http://www.mono-project.com/docs/advanced/pinvoke/dllnotfoundexception/ http://www.mono-project.com/ ...

  10. ecshop Admin后台商品列表处(上架、下架、精品...取消精品)增加操作

    相关文件:goods.php,goods_list.htm 思路: a.增添连接“转移仓库” b.在goods.php,读取仓库列表数据,并且实例化 c. 在goods_list.htm循环数据.点击 ...