设计模式——工厂模式(Factory)

要想正确理解设计模式,首先必须明白它是为了解决什么问题而提出来的。

设计模式学习笔记

——Shulin

转载请注明出处:http://blog.csdn.net/zhshulin

1、概念

工厂模式定义:实例化对象,用工厂方法取代new操作。达到解耦的目的(避免硬编码耦合)。工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。

工厂模式是我们最经常使用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统能够说是随处可见。由于工厂模式就相当于创建实例对象的new,我们经常要依据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,能否够考虑使用工厂模式,尽管这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的改动量。

经常使用的java ee框架:Spring,Spring容器就是一个巨大的工厂。

2、目的

       解耦,使程序的扩展性更强。

3、举例说明

比方如今有2个工作AWork和BWork,以后可能很多其它。假设此时我们使用简单工厂方法,那么我们会设计一个WorkFactory然后实现一个静态方法,通过參数来控制生成哪个工作。看似简单工厂也能完毕任务,可是假设以后须要加上CWork,那么须要加入CWork实现类以及改动工厂方法,假设很多其它,那么会导致工厂类过于臃肿。由于简单工厂模式仅仅有一个工厂类,它须要处理全部的创建的逻辑。

这时候就须要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责全部的对象的创建,而是将详细创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出详细工厂子类必须实现的接口,而不接触哪一个类应当被实例化这样的细节。

这样的进一步抽象化的结果,使这样的工厂方法模式能够用来同意系统在不改动详细工厂角色的情况下引进新的产品,这一特点无疑使得工厂方法模式具有超过简单工厂模式的优越性。以下就针对以上需求设计UML图:

从上图能够看出,这个使用的工厂方法模式的系统涉及到下面角色:

  抽象工厂(IWorkFactory)角色:担任这个角色的是工厂方法模式的核心,不论什么在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常用抽象类实现。

  详细工厂(AWorkFactory、BWorkFactory)角色:担任这个角色的是实现了抽象工厂接口的详细JAVA类。详细工厂角色含有与业务密切相关的逻辑,而且受到使用者的调用以创建工作类。

  抽象工作(IWork)角色:工厂方法模式所创建的对象的超类,也就是全部工作类的共同父类或共有的接口。在实际的系统中,这个角色也常用抽象类实现。

  详细工作(AWork和BWork)角色:这个角色实现了抽象(ExportFile)角色所声明的接口,工厂方法模式所创建的每个对象都是某个详细工作角色的实例。

4、源码

抽象工作类:

public interface IWork {
	public void doWork();
}

详细工作类:

public class AWork implements IWork {
	@Override
	public void doWork() {
		System.out.println("做的是A工作!");
	}
}
public class BWork implements IWork {
	@Override
	public void doWork() {
		System.out.println("做的是B工作!");
	}
}

抽象工厂:

public interface IWorkFactory {
	public IWork createWork();
}

详细工厂:

public class AWorkFactory implements IWorkFactory {

	@Override
	public IWork createWork() {
		return new AWork();
	}

}
public class BWorkFactory implements IWorkFactory {

	@Override
	public IWork createWork() {
		return new BWork();
	}

}

client角色类源码:

public class Test {

	public static void main(String[] args) {
		IWorkFactory aWorkFactory = new AWorkFactory();
		IWork aWork = aWorkFactory.createWork();
		aWork.doWork();

		IWorkFactory bWorkFactory = new BWorkFactory();
		IWork bWork = bWorkFactory.createWork();
		bWork.doWork();
	}

}

5、工厂模式和简单工厂模式

工厂方法模式和简单工厂模式在结构上的不同非常明显。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个详细类上。

  工厂方法模式退化后能够变得非常像简单工厂模式。设想假设非常确定一个系统仅仅须要一个详细工厂类,那么最好还是把抽象工厂类合并到详细工厂类中去。因为仅仅有一个详细工厂类,所以最好还是将工厂方法改为静态方法,这时候就得到了简单工厂模式。

  假设系统须要增加一个新的工作CWork,那么所须要的就是向系统中增加一个这个导类以及所相应的工厂类。没有必要改动client,也没有必要改动抽象工厂角色或者其它已有的详细工厂角色。对于增加新的导出类型而言,这个系统全然支持“开-闭原则”。

(原文地址:http://blog.csdn.net/zhshulin/article/details/38339085)

时间: 2024-08-03 20:08:14

设计模式——工厂模式(Factory)的相关文章

设计模式-工厂模式[Factory]

先看下一个简单的实现: 1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description: Sample子类的标示 5 * BeanEm.java Create on 2014年7月11日 下午2:37:58 6 * @author [email protected] 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Res

23种设计模式--工厂模式-Factory Pattern

一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例就就依赖与这个类,2者之间的耦合度就高,此时我们就可以使用面向对象的去解决这个问题,将变化点封装起来,这就是我们将要首先引入的简单工厂模式:先来说一个场景,比如我们吃水果这个例子吧,我们有时候想吃苹果,有时候想吃橘子,但是每次都需要去买这些水果,后来有个水果店,又卖橘子,又卖苹果,这个水果店就当于简

设计模式(一)工厂模式Factory(创建类型)

设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. 举例来说, 很多类型对象的创造须要一系列的步骤: 你可能须要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你须要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你怎样能轻松方

设计模式一 工厂模式Factory

设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便

设计模式(一)工厂模式Factory(创建型)(转)

原文链接:http://blog.csdn.net/hguisu/article/details/7505909 设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对

6.大话设计模式-工厂模式

工厂模式和简单工厂有什么区别.废话不多说,对比第一篇例子应该很清楚能看出来. 优点: 工厂模式弥补了简单工厂模式中违背开放-封闭原则,又保持了封装对象创建过程的优点. using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace DesignModel{    public interface Factory   

设计模式——工厂模式学习

1.概念 工厂模式定义:实例化对象,用工厂方法代替new操作.达到解耦的目的(避免硬编码耦合).工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式. 工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例

二十三种设计模式——工厂模式

二十三种设计模式--工厂模式 简单工厂模式 简单工厂模式又称静态工厂方法(StaticFactory Method)模式,不属于23种模式之一. 简单工厂模式是工厂模式最简单使用的模式. 类图: 程序: #include <iostream> #include<string> using namespace std; class NationalFlag//父类 { public: NationalFlag(){} ~NationalFlag(){} virtual void di

工厂模式(Factory)和抽象工厂模式(Abstract Factory)

一.工厂模式(Factory):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的,工厂方法让类的实例化推迟到子类 (1)涉及角色:抽象产品,具体产品,抽象创建者,具体创建者.                (2)实例:    抽象产品类 1 public abstract class ProductNoodle { 2 public abstract String description(); 3 } 具体产品类 1 public class ConcreteNoodleA e

设计模式---工厂模式---生产水果

设计模式---工厂模式 需要一个基本的抽象类:相当一个基本的工厂 需要若干个具体类:相当若干个产品 需要工具类:相当工厂中机器,用来选择不同的产品生产 需要主类:相当顾客所想的订单 主类 ----> 工厂类 ----> 产品类 ---> 产品具体类 老板根据顾客的订单,在工具堆中选择合适的,然后去工厂中生产适合的产品,返回给顾客 优势:能够在不修改原先的代码情况,增加所需的类与方法. 不足:会增多类文件的数量 接口:提供的内容,相当于协议,即外界使用此接口时,接口的内容是不允许外界对接口