工厂模式,主要实现了创建者和调用者的分离。

  分类:1、简单工厂模式;2、工厂方法模式;3、抽象工厂模式。

  核心:实例化对象时,用工厂方法代替new操作。

  一、简单工厂模式

    也叫静态工厂模式,工厂类中实现静态方法,根据入参,生产不同的产品,工程项目中常用。

    工厂类作为类使用,产品类作为接口使用,具体产品实现接口,用来生产同一等级结构中的任意产品,当新增产品时,需要修改已有的代码。

 package com.corey.factory.simpleFactory;

 /**
* 产品类接口
* @author Corey
*
*/
public interface Computer {
void calcData();
}
 package com.corey.factory.simpleFactory;

 /**
* 具体产品实现接口
* @author Corey
*
*/
public class HighEndComputer implements Computer{ @Override
public void calcData() {
System.out.println("高端电脑计算速度快!");
} }
 package com.corey.factory.simpleFactory;

 /**
* 具体产品实现接口
* @author Corey
*
*/
public class LowEndComputer implements Computer{ @Override
public void calcData() {
System.out.println("低端电脑计算速度慢!");
} }
 package com.corey.factory.simpleFactory;

 /**
* 产品工厂类,生产同一等级结构中的任意产品
* @author Corey
*
*/
public class ComputerFactory { public static Computer CreateComputer(String type){
Computer computer = null; switch(type){
case "HighEnd":
computer = new HighEndComputer();
break;
case "LowEnd":
computer = new LowEndComputer();
break;
default:
break;
}
return computer;
}
}
 package com.corey.factory.simpleFactory;

 /**
* 测试简单工厂模式
* @author Corey
*
*/
public class Test { public static void main(String[] args) {
Computer c1 = ComputerFactory.CreateComputer("HighEnd");
c1.calcData(); Computer c2 = ComputerFactory.CreateComputer("LowEnd");
c2.calcData(); } }

运行结果:
高端电脑计算速度快! 
低端电脑计算速度慢!

  二、工厂方法模式

    工厂类作为接口使用,固定产品工厂类实现接口,用来生产统一等级结构中的固定产品,可扩展任意产品。

 package com.corey.factory.factoryMethed;

 /**
* 产品工厂类作为接口使用
* @author Corey
*
*/
public interface ComputerFactory { Computer CreateComputer();
}
 package com.corey.factory.factoryMethed;

 /**
* 具体产品工厂类实现接口
* @author Corey
*
*/
public class HighEndComputerFactory implements ComputerFactory{ @Override
public Computer CreateComputer() {
return new HighEndComputer();
} }
 package com.corey.factory.factoryMethed;

 /**
* 具体产品工厂类实现接口
* @author Corey
*
*/
public class LowEndComputerFactory implements ComputerFactory{ @Override
public Computer CreateComputer() {
return new LowEndComputer();
} }
 package com.corey.factory.factoryMethed;

 /**
* 测试工厂方法模式
* @author Corey
*
*/
public class Test { public static void main(String[] args) {
Computer c1 = new HighEndComputerFactory().CreateComputer();
c1.calcData(); Computer c2 = new LowEndComputerFactory().CreateComputer();
c2.calcData(); } }

  三、抽象工厂模式

    工厂类作为接口使用,内含生产配件方法接口,产品配件类作为接口使用,具体产品配件类实现接口,具体产品工厂类实现工厂类,用来生产不同产品族的全部产品,无法增加新产品,可扩展产品族。

 package com.corey.factory.abstractFactory;

 /**
* 工厂类作为接口使用,内含组装配件方法接口
* @author Corey
*
*/
public interface ComputerFactory {
MainBoard createMainBoard(); //生产主板配件
HardDisk createHardDisk(); //生产硬盘配件
Memory createMemory(); //生产内存配件 }
 package com.corey.factory.abstractFactory;

 /**
* 产品配件类作为接口使用
*
* @author Corey
*
*/
public interface HardDisk {
void speed(); //硬盘实现方法
}
 package com.corey.factory.abstractFactory;

 /**
* 具体产品配件类实现接口
* @author Corey
*
*/
public class HighEndHardDisk implements HardDisk{ @Override
public void speed() {
System.out.println("高端硬盘速度快!");
} }
 package com.corey.factory.abstractFactory;

 /**
* 具体产品工厂类实现工厂类,用来生产不同产品族的全部产品
* @author Corey
*
*/
public class HighEndComputerFactory implements ComputerFactory { @Override
public MainBoard createMainBoard() {
return new HighEndMainBoard();
} @Override
public HardDisk createHardDisk() {
return new HighEndHardDisk();
} @Override
public Memory createMemory() {
return new HighEndMemory();
} }
 package com.corey.factory.abstractFactory;

 /**
* 测试抽象工厂模式
* @author Corey
*
*/
public class Test { public static void main(String[] args) {
ComputerFactory h = new HighEndComputerFactory();
HardDisk hHardDisk = h.createHardDisk();
MainBoard hMainBoard = h.createMainBoard();
Memory hMemory = h.createMemory();
hHardDisk.speed();
hMainBoard.speed();
hMemory.speed(); ComputerFactory l = new LowEndComputerFactory();
HardDisk lHardDisk = l.createHardDisk();
MainBoard lMainBoard = l.createMainBoard();
Memory lMemory = l.createMemory();
lHardDisk.speed();
lMainBoard.speed();
lMemory.speed();
}
}

运行结果:

高端硬盘速度快!
高端主板速度快!
高端内存速度快!
低端硬盘速度慢!
低端主板速度慢!
低端内存速度慢!

工厂模式基本就这些内容。

另,简单工厂还有另一种实现方式,就是编写不同的静态方法创建不同的产品,而无需传参,但是调用者需要知道更多的方法名。

Java设计模式学习笔记,二:工厂模式的更多相关文章

  1. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  2. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  3. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

  4. Java设计模式学习记录-抽象工厂模式

    前言 上篇博客介绍了简单工厂模式和工厂方法模式,这次介绍抽象工厂模式,抽象工厂模式和工厂方法模式的区别在于需要创建对象的复杂程度上. 抽象工厂模式 抽象工厂模式是围绕着一个超级工厂创建其他工厂.这个超 ...

  5. Java 设计模式学习笔记1——策略模式(Duck例子)

    0.假设现有工程(Duck)中遇到为类添加功能的问题,如何设计类添加新的功能? 1.利用继承提供的Duck(鸭子)的行为会导致哪些缺点? (1)代码在多个子类中重复 (2)很多男知道所有鸭子的全部行为 ...

  6. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  7. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  8. java设计模式学习笔记--接口隔离原则

    接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...

  9. java设计模式学习笔记--单一职责原则

    单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...

  10. java设计模式学习笔记--浅谈设计模式

    设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...

随机推荐

  1. 【Android Developers Training】 51. 序言:打印内容

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 获取元素到body/html的距离函数

    获取元素到body的距离: <script> function offsetDis(obj) { var l = 0, t = 0; while(obj) { l = l + obj.of ...

  3. Easyui设置动态表格,动态导出数据实例,附Demo

    最近开发的过程中碰到一个客户提出的需求,一个指定的页面导出需要提供一个弹出页面选择列表页面需要显示的列,页面确认之后需要修改列表页面显示的表格,导出的数据也需要同步变化. 总结一下可以称为一个列表数据 ...

  4. v2013调试无法访问此网站 localhost 拒绝了我们的连接请求

    问题描述:          别人给的服务器代码,在本地部署以后调试的,localhost:8080 可以访问,localhost:2524访问不了需要改什么配置吗 解决思路:           这 ...

  5. java基础系列--Date类

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7126930.html 1.Date类概述 Date类是从JDK1.1就开始存在的老类,其提 ...

  6. VB6之GDI+加载PNG图片

    原生的VB6不支持PNG个图片,因为刚有VB的时候还没有PNG的概念呢.不过,利用GDI+加载解析个PNG简直是砍瓜切菜般简单. GDI+的模块是我在网上下载的,地址应该是:http://vistas ...

  7. python编程快速上手之第10章实践项目参考答案

      本章主要讲了python程序的调试,当程序有BUG或异常的时候,我们如何调试代码找出问题点.其实在本章之前的章节我们做练习的时候都会遇到各种各样的错语和异常,最初当不知道程序哪里出错的情况下不可否 ...

  8. Chrome浏览器扩展开发系列之五:Page Action类型的Chrome浏览器扩展

    Page Action类型的Google Chrome浏览器扩展程序,通常也会有一个图标,但这个图标位于Chrome浏览器的地址栏内右端.而且这个图标并非始终出现,而是当某指定的页面打开时才会出现.也 ...

  9. 取一个整数a从右端开始的4~7位

    题目:取一个整数a从右端开始的4-7位. 程序分析:可以这样考虑: (1)先使a右移4位. (2)设置一个低4位全为1,其余全为0的数.可用~(~0 < <4) (3)将上面二者进行&am ...

  10. 列表的系列操作(python)

    除了定义和切片外,这里总结下系列的操作: # hanbb come on! names = ["hbb",'tian','bao','cheng'] #Add names.appe ...