`
lcwyiyun
  • 浏览: 11428 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

第一天 工厂模式之工厂方法模式

阅读更多
        工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
        工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

工厂方法模式角色与结构
        抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
        具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。
        抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
        具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。
       某具体产品有专门的具体工厂创建,它们之间往往一一对应。

工厂方法模式的应用
  工厂方法经常用在以下两种情况中:
        第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
        第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。

示例代码:
抽象产品角色:
public interface Car {
	public void drive();
}


具体产品角色:
public class BMWCar implements Car{
	public void drive() {
		System.out.println("驾驶了一辆宝马汽车");
	}
}

public class QQCar implements Car{
	public void drive() {
		System.out.println("驾驶了一辆QQ汽车");
	}
}


抽象工厂角色:
public interface CarFactory {
	public abstract Car getCar();
}


具体工厂角色:
public class BMWCarFactory implements CarFactory{
	public Car getCar() {
		return new BMWCar();
	}
}

public class QQCarFactory implements CarFactory{
	public Car getCar() {
		return new QQCar();
	}
}


测试代码:
public class Client {
	public static void main(String[] args) {
		CarFactory bmwFactory = new BMWCarFactory();
		Car bmwCar = bmwFactory.getCar(); 
		bmwCar.drive();
		
		CarFactory qqFactory = new QQCarFactory();
		Car qqCar = qqFactory.getCar();
		qqCar.drive();
	}
}
分享到:
评论

相关推荐

    设计模式第一天学习内容

    6. 掌握简单工厂模式 7. 掌握工厂方法模式 8. 掌握抽象工厂模式 9. 掌握原型模式 10. 掌握构建者模式 课程内容 1. 了解OOP、OOA、OOD的概念 2. 了解UML的类图,包括类与接口的定义以及类与类的关系 3. 了解面向对象...

    应用了设计模式之简单工厂模式的计算器

    完成了,但感觉这也没啥特别的,程序界面黑布隆冬的,内部结构也是最最平常的面向对象,于是我应用了《大话设计模式》这本书中的第一个模式——简单工厂模式,看上去还不错。界面的话,也就是输出的语句变了,system...

    何红辉关爱民-Android源码设计模式解析与实战(带书签第2版).pdf

    本书的主要内容为:优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器...

    何红辉关爱民-Android源码设计模式解析与实战(带书签高清第2版).pdf

    本书的主要内容为:优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器...

    netcore,依赖注入、工厂数据库连接模式、linq、EF

    本项目包为vue项目,从vue小白到高手,从一个内容管理网站开始实战开发第八天的项目包,项目包中使用的是netcore实现了工厂模式数据库生产,依赖注入、linq、EF等技术。项目组要是提供vue项目从小白到高手的课程学习...

    spring5第一天.pdf

    介绍:spring框架的概述以及spring中基于XML的IOC配置。 主要内容: 1、spring的概述 ... 工厂模式解耦 3、IOC概念和spring中的IOC spring中基于XML的IOC环境搭建 4、依赖注入(Dependency Injection)

    spring框架技术+第2天+xmind思维导图

    总结,我们会选择第一种方式,因为spring的存在就是要消除工厂模式,因为工厂本身就会在每次调用时new出对象,只是把new的工作换了个地方而已。bean作用域singleton prototype;bean作用域request session global...

    SSM框架的学习与应用-Java EE企业级应用开发学习记录-(第六天)初识Spring框架

    在这一部分中,你将了解到Spring框架的基本概念和使用方法,并通过实例探讨了Spring IoC的控制反转和简单工厂模式。 该资源主要包含以下内容(项目文件实例和注释齐全可以帮助你理): Spring框架简介:对Spring...

    java与模式-设计模式之禅

    这本书看起来没有那么乏味,没有那么抽象,归纳总结的很好,例子特有意思,第一次传。

    asp.net知识库

    Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把...

    初次接触php抽象工厂模式(Elgg)

    两天在开发用elgg作为基础的sns网站时,第一次遇到了策略模式的运用。

    自制PHP框架之设计模式

    本文是自制PHP框架的第三篇,我们主要来讲解下PHP的设计模式的使用,本文我们一起来学习PHP中最常用的三种设计模式:单例设计模式、工厂设计模式和观察者设计模式。

    论文研究 - 牛粪替代化石燃料生产沼气的实验研究

    为了解决化石燃料使用和温室气体排放的问题,沼气被认为是清洁可再生能源的潜在来源。 这项工作的目的是分析当厌氧消化池... 从第一天到第三十天,牛粪的沼气产量在0到340毫升之间波动。 牛粪的pH在保留期内逐渐降低。

    软件框架设计的艺术

    17.2.5 第一天的解决方案 310 17.3 第二天 313 17.3.1 我想修正犯下的错误 316 17.3.2 第二天的解决方案 317 17.4 第三天:评判日 320 17.5 也来玩下这个游戏吧 327 第18章 可扩展Visitor模式的...

    编程新手真言......

    12.1 第一天:接到一个案子 207 12.2 第二天:需求分析 208 第13章 设计(领域分析与抽象) 210 13.1 原语设计 210 13.2 了解Yake 216 13.3 GVWL1.0开发 222 13.4 范型设计与实作 223 第14章 编码 224 14.1 原语设计...

    最新Java面试宝典pdf版

    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...

    Java面试宝典2010版

    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户。...

    Java面试笔试资料大全

    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...

Global site tag (gtag.js) - Google Analytics