设计模式----创建型模式之工厂模式(FactoryPattern)
工厂模式主要分为三种简单工厂模式、工厂方法模式、抽象工厂模式三种。顾名思义,工厂主要是生产产品,作为顾客或者商家,我们不考虑工厂内部是怎么一个流程,我们要的是最终产品。将该种思路放在我们面向对象开发实战中,就能使我们代码达到解耦。
首先,在引出这三种关于工厂模式,我们介绍几组对象:
1、抽象产品。所谓抽象产品,是具体抽象的抽象形式。例如:披萨、原料、汽车等(注:披萨和原料引自head first设计模式一书)。
2、具体产品。抽象产品的具体化。蛤蜊披萨和素食披萨等就是抽象产品的具体化产品,面团、酱料和芝士等就是原料的具体化产品,但是会因为地域性差异,同一种产品是有所区别的。
3、工厂。客户使用工厂对象方法获取到具体产品。
- 简单工厂模式(Simple Factory Pattern)
UML结构图如下所示:
从UML结构图可以看出(注:简单工厂模式又称静态工厂模式):
- 工厂与抽象产品的关系是组合关系;
- 工厂类通过createProduct()方法创建产品,该方法内部根据形参;
- 作为Client,只需要通过实例化Factory调用creatProduct(){若该方法为非静态方法,若静态方法直接调用,不需要实例}获取相应的具体产品实例。
简单工厂模式遵循着“封装变化”原则。客户后续需要更多种类的产品,只需要修改工厂类及新增具体产品类即可,从而产品的使用和产生的隔离。
简单实例:
public abstract class Product { } public class ProductA extends Product{
public String toString() {
return "I am Product A";
}
} public class ProductB extends Product{
public String toString() {
return "I am Product B";
}
} public class SimpleFactory {
Product product;
public Product createProduct(int param){
switch (param) {
case 1:
product =new ProductA();
break;
case 2:
product =new ProductB();
break;
default:
break;
}
return product;
}
public static void main(String[] args) {
SimpleFactory factory = new SimpleFactory();
Product proA = factory.createProduct(1);
System.out.println(proA);
Product proB = factory.createProduct(2);
System.out.println(proB);
}
/** 输出:
* I am Product A
* I am Product B
*
*/
}
- 工厂方法模式(Factory Method Pattern)
简单工厂模式自身存在缺点,主要实现的目的是把变化部分出去出来,便于我们修改。但是这样对于新增产品,我们就得就修改工厂类,这样一来就已经不遵循“开-闭”原则{对修改关闭,对扩展开放}。
因此,我们引入工厂方法模式:
定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。
UML结构图如下所示:
利用工厂方法模式生产产品A或产品B,代码如下所示:
//所有具体工厂的抽象工厂
public abstract class Factory {
public abstract Product createProduct();
}
//生产A的具体工厂
public class ProductFactoryA extends Factory {
public Product createProduct() {
return new ProductA();
}
} //生产B的具体工厂
public class ProductFactoryB extends Factory {
public Product createProduct() {
return new ProductB();
}
} public class Client {
public static void main(String[] args) {
Factory factory = new ProductFactoryA();
Product proA = factory.createProduct();
System.out.println(proA);
Factory factory2 = new ProductFactoryB();
Product proB = factory2.createProduct();
System.out.println(proB);
/**
* 输出:
* I am Product A
* I am Product B
*/
}
}
- 抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式提供一个接口,用于创建相关或依赖的家族,而不需要明确指定具体类。
UML结构图如下图所示(参照于head first设计模式一书):
抽象工厂方法其实就是工厂方法的一种升华:1、从客户的角度来看,只需要关注抽象工厂和抽象产品,不需要关注具体的产品和具体的工厂类实现。2、从抽象工厂的角度来看,不需要关注具体的工厂实现,也不需要关注生产产品,生产产品的都是派生类来实现。3、从具体工厂的角度来看,生产的产品有一定的共性,不需要关注具体产品的实现。。。这些都可以从类图里面看出来。通过类图,我们发现:工厂抽象和产品抽象是隔离的。
觉得《Head First 设计模式》书中的例子才是经典的,就不给出源码,想看的只能找度娘了。
- 总结
1、所谓工厂,都是用来封装对象的创建;
2、简单工厂实现将客户程序从具体类中解耦。但如果扩展产品,只能在工厂类里面修改,对于后期的维护以及扩展增加了困难;
3、工厂方法使用了继承,把对象创建委托给子类,子类实现工厂方法来创建对象;
。。。。
这两个月工作有点忙,顺便学习了原始的servlet,设计模式看得比较少。共勉
设计模式----创建型模式之工厂模式(FactoryPattern)的更多相关文章
- JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式
上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...
- PYTHON设计模式,创建型之简单工厂模式
这个系统,感觉思路清爽,,相信多练练,多思考,就会熟悉的.. http://www.jianshu.com/p/2450b785c329 #!/usr/bin/evn python #coding:u ...
- 【C#设计模式——创建型模式】抽象工厂模式
抽象工厂模式比工厂模式具有更高层次的抽象性.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以选择这种模式.直接进入示例. 示例描述:完成花园的规划,多种花园种类,每个里面多种 ...
- java设计模式--创建型模式(一)
2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...
- 创建型模式(过渡模式) 简单工厂模式(Simple Factory)
简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一个类来负责创建其他类的 ...
- C#设计模式-创建型模式(转)
一.简单工厂模式 简单工厂模式Simple Factory,又称静态工厂方法模式.它是类的创建模式.是由一个工厂对象决定创建出哪一种产品类的实例,是不同的工厂方法模式的一个特殊实现. 优点: u 模式 ...
- OOAD之创建型模式之工厂模式
首先我们为什么要学习设计模式呢? 1)模式从经验中总结出来的,经过证实的方案,模式只有在实际系统中经过多次验证之后才能成为模式. 2) 提高系统的可维护性, 通过使用设计模式,在系统面临升级和维护时, ...
- Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)
Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...
- Unity C# 设计模式(二)简单工厂模式
定义: 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 ...
- Java设计模式学习笔记(四) 抽象工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...
随机推荐
- SpringBoot + JPA问题汇总
实体类有继承父类,但父类没有单独标明注解 异常表现 Caused by: org.hibernate.AnnotationException: No identifier specified for ...
- VUE Node模式下,如何改变菜单的颜色,如何将超长文字缩略显示,在鼠标进入后展开全部显示,鼠标移出则恢复缩略显示
VUE Node模式下,如何改变菜单的颜色,如何将超长文字缩略显示,在鼠标进入后展开全部显示,鼠标移出则恢复缩略显示: “事件”引起变量值的变化,系统引擎自动根据变量值的变化刷新页面 在VUE Nod ...
- vue-property-decorator vue typescript写法
什么是Typescript TypeScript 是一种由微软开发的自由和开源的编程语言,它是 JavaScript 的一个超集,扩展了 JavaScript 的语法.作者是安德斯大爷, Delphi ...
- 随笔之AJAX粗解 小白入门向
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 最大的 ...
- CentOS7.2搭建LAMP环境
所谓的Lamp就是:Linux+Apache+mysql+php.这里的Linux使用CentOS7.2. 0x00 开始我们可以先更新一下yum: # 升级所有包同时也升级软件和系统内核 yum - ...
- response对响应的设置
1.response对象设置响应行状态码: protected void doGet(HttpServletRequest request, HttpServletResponse response) ...
- PHPCon 2019 第七届 PHP 开发者大会总结
往届回顾-2018:PHPCon 2018链接: https://pan.baidu.com/s/17nfrfqk9K4vwKPAsjBVW7A——提取码:rjbr 随着PHP7的诞生,兼顾了高性能和 ...
- TestNG(十五)xml文件实现多线程测试
package com.course.testng.thread; import org.testng.annotations.Test; public class ThreadOnXml { @Te ...
- [VB.NET Tips]赋值运算千万要注意
赋值运算符是一个语句,不能在表达式中使用,表达式中的等号表示相等而不是赋值. 上示例: Dim x As Integer Dim y As Object x = 5 y = x = 5 Console ...
- [Linux] Telnet提示:Unable to connect to remote host: No route to host
出错现象: [root@localhost ~]# telnet 192.168.1.128 Trying 192.168.1.128...telnet: connect to address 192 ...