JAVA设计模式之---工厂模式
1、引言
工厂模式可以分为类:
1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)
这种模式从上到下逐步抽象,并且更具一般性,且通常将简单工厂模式看为工厂方法模式的一种特例,两者归为一类。
2、区别
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
总结:
工厂方法模式只一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
3、示例
1)简单工厂模式
产品类:
public class BMW {
public BMW() {
}
}
public class BMWX1 extends BMW {
public BMWX1() {
System.out.println("this is BMW X1");
}
}
public class BMWX7 extends BMW {
public BMWX7() {
System.out.println("this is BMW X7");
}
}
工厂类:
public class BMWFactory {
public BMW creatBMW(String type){
if (type.equals("X1")) {
return new BMWX1();
} else if (type.equals("X7")) {
return new BMWX7();
} else {
return null;
}
}
}
客户类:
public class Customer {
public static void main(String[] args) {
BMWFactory factory = new BMWFactory();
BMW X1 = factory.creatBMW("X1");
BMW X7 = factory.creatBMW("X7");
}
}
每增加一种车型,需增加一个if-else条件语句,违反了对扩展开放,对修改关闭原则
2)工厂方法模式:
产品类:
public class BMW {
public BMW() {
}
}
public class BMWX1 extends BMW {
public BMWX1() {
System.out.println("BMW X1");
}
}
public class BMWX7 extends BMW {
public BMWX7() {
System.out.println("BMW X7");
}
}
工厂类:
public interface BMWFactory {
BMW createBMW();
}
public class BMWX1Factory implements BMWFactory {
@Override
public BMW createBMW() {
return new BMWX1();
}
}
public class BMWX7Factory implements BMWFactory {
@Override
public BMW createBMW() {
return new BMWX7();
}
}
客户类:
public class Customer {
public static void main(String[] args) {
BMWX1Factory x1 = new BMWX1Factory();
x1.createBMW();
BMWX7Factory x7 = new BMWX7Factory();
x7.createBMW();
}
}
客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象。
3)抽象工厂模式:
产品类:
public interface Engine {
}
public class EngineA implements Engine {
public EngineA() {
System.out.println("Engine A");
}
}
public class EngineB implements Engine {
public EngineB() {
System.out.println("Engine B");
}
}
public interface AirCondition {
}
public class AirConditionC implements AirCondition {
public AirConditionC() {
System.out.println("AirCondition C");
}
}
public class AirConditionD implements AirCondition {
public AirConditionD() {
System.out.println("AirCondition D");
}
}
工厂类:
public interface Abstractfactory {
public Engine selectEngine();
public AirCondition selectAirCondition();
}
public class FactoryBMWX1 implements Abstractfactory {
@Override
public Engine selectEngine() {
return new EngineA();
}
@Override
public AirCondition selectAirCondition() {
return new AirConditionC();
}
}
public class FactoryBMWX7 implements Abstractfactory{
@Override
public Engine selectEngine() {
return new EngineB();
}
@Override
public AirCondition selectAirCondition() {
return new AirConditionD();
}
}
客户类:
public class Customer {
public static void main(String[] args) {
FactoryBMWX1 x1 = new FactoryBMWX1();
x1.selectEngine();
x1.selectAirCondition();
FactoryBMWX7 x7 = new FactoryBMWX7();
x7.selectEngine();
x7.selectAirCondition();
}
}
提供多个工厂角色分别对应多个产品角色,每一个具体工厂角色只负责某一个产品角色的实例化,每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
4、总结
无论是哪种工厂模式,在形式和特点上也是极为相似的,最终目的都是为了解耦。在使用时,不必在意具体属于哪种模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
转自:http://blog.csdn.net/jason0539
JAVA设计模式之---工厂模式的更多相关文章
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- 浅析JAVA设计模式之工厂模式(二)
1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...
- java设计模式2————工厂模式
1.工厂模式介绍: 1.1.实现了创建者与调用者的分离 1.2.详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 1.3.所遵循的OOP原则: 开闭原则:对扩展开放,对修改关闭 依赖倒转原则:面向 ...
- java 设计模式之工厂模式与反射的结合
工厂模式: /** * @author Rollen-Holt 设计模式之 工厂模式 */ interface fruit{ public abstract void eat(); } ...
- JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
- Java设计模式之-----工厂模式(简单工厂,抽象工厂)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- Java设计模式之工厂模式(简单工厂模式+工厂方法模式)
摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...
- java设计模式之一工厂模式
简单工厂模式是java设计模式中最简单的设计模式之一: 工厂模式是最常用的设计模式之一. 工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模 ...
随机推荐
- django笔记整理
Django复习: MTV模型: manager启动服务→urls找到路径→(找到views视图函数或者做路由分发)→视图函数处理相关逻辑,返回一个模板或者是字符串: ---------------- ...
- Spring Boot项目构建
环境准备 IDEA+JDK 1.8+Maven+mysql+SSM 1.使用Spring Boot框架可以大大加速Web应用的开发过程,首先在Maven项目依赖中引入spring-boot-start ...
- 使用Vue快速开发单页应用
本文所涉及代码全在vue-cnode 单页应用,即在一个页面集成系统中所有功能,整个应用只有一个页面.因为路由的控制在前端,单页面应用在页面切换时比传统页面更快,从而在前端体验更好. 将逻辑从后端转移 ...
- 洛谷 P1914 小书童——密码【字符串+模拟】
P1914 小书童——密码 题目背景 某蒟蒻迷上了“小书童”,有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一串字母组成.且 ...
- BZOJ 1061: [Noi2008]志愿者招募【单纯形裸题】
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4813 Solved: 2877[Submit][Stat ...
- 水dp第二天(背包有关)
水dp第二天(背包有关) 标签: dp poj_3624 题意:裸的01背包 注意:这种题要注意两个问题,一个是要看清楚数组要开的范围大小,然后考虑需要空间优化吗,还有事用int还是long long ...
- Java入门篇(三)——Java流程控制
前两篇已经了解了Java语言基础,本篇开始Java的流程控制.流程控制对任何一门编程语言都是至关重要的,它提供了控制程序步骤的基本手段. 一.复合语句 Java语言的复合语句是以整个块区为单位的语句, ...
- c语言基础学习02_windows系统下的cmd命令
=============================================================================注意:cmd的命令很多,需要用的时候可以查询即 ...
- c++(线性队列)
这里的线性结构实际上指的就是连续内存的意思,只不过使用“线性”这个词显得比较专业而已.前面一篇博客介绍了现象结构的处理方法,那么在这个基础之上我们是不是添加一些属性形成一种新的数据结构类型呢?答案是肯 ...
- flume1.8 开发指南学习感悟
概述: Apache Flume是一个分布式.可用的系统,用于从许多不同的sources有效的收集并移动大量日志数据用于集中存储数据. 架构及数据流动模型: flume实际上就是一个Agent.Age ...