【设计模式】工厂设计模式
工厂设计模式
- 三种工厂模式
- 简单工厂模式(静态工厂模式)
- 基本介绍
- 设计方案
- 工厂方法模式
- 基本介绍
- 设计方案
- 抽象工厂模式
- 基本介绍
- 设计思路
- JDK源码 Calendar类
通过具体的需求
看一个披萨的项目:要便于披萨种类的扩展,要便于维护
- 披萨的种类很多(比如 GreekPizz、 CheesePizz 等)
- 披萨的制作有 prepare, bake, cut, box
- 完成披萨店订购功能。
首先我们如果用传统的方式完成,
我们会用一个OrderPizza.java 类来根据用户输入直接new 对应的pizza ,如下:
if (ordertype.equals("greek")) {pizza = new GreekPizza();} else if (ordertype.equals("pepper")) {pizza = new PepperPizza();} else if (ordertype.equals("cheese")) {pizza = new CheesePizza();} else {break;}
}
这样如果我们要新增一个Pizza的种类,我们需要 去OrderPizza.java中再加一个 else if, 而且通常情况OrderPizza类不止有一种, 我们新增的时候就要去每个定Pizza的类都加.
因此传统方式是违反了设计模式的ocp原则,即对扩展开放,对修改关闭.即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码
三种工厂模式
软件开发中,当我们会用到大量的创建某种 某类或某批对象时,就会使用工厂模式
- 工厂模式的意义
将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。 - 三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)
- 设计模式的依赖抽象原则
- 创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。
- 不要让类继承具体类,而是继承抽象类或者是实现interface(接口)
- 不要覆盖基类中已经实现的方法。
简单工厂模式(静态工厂模式)
基本介绍
- 简单工厂模式属于创建型模型,是工厂模式的一种.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式.
- 简单工厂模式定义了一个创建对象的类,由这个类来封装实例化对象的行为
设计方案
- 改进思路:简单工厂模式:创建Pizza对象封装到一个类中,这样我们有新的Pizza种类时,只需要修改该类就可, 其它有创建到Pizza对象的代码就不需要修改了
- SimplePizzaFactory定义一个可以实例化Pizaa对象的类,封装创建对象的代码
public class SimplePizzaFactory {public Pizza createPizza(String type) {System.out.println("使用简单工厂模式~~");Pizza pizza = null;if (type.equals("cheese")) {pizza = new CheesePizza();} else if (type.equals("greek")) {pizza = new GreekPizza();} else if (type.equals("pepper")) {pizza = new PepperPizza();return pizza;}}
**这里的createPizza也通常写成静态方法,这样就可以直接调用 **
- OrderPizza通过调用SimplePizzaFactory的createPizza 方法来创建相应的Pizza对象
public class OrderPizza {//定义一个简单工厂对象SimpleFactory simpleFactory;Pizza pizza = null;//构造器public OrderPizza(SimpleFactory simpleFactory) {setFactory(simpleFactory);}public void setFactory(SimpleFactory simpleFactory) {String orderType = ""; //用户输入的this.simpleFactory = simpleFactory; //设置简单工厂对象do {orderType = getType(); pizza = this.simpleFactory.createPizza(orderType);//输出pizzaif(pizza != null) { //订购成功pizza.prepare();pizza.bake();pizza.cut();pizza.box();} else {System.out.println(" 订购披萨失败 ");break;}}while(true);}// 写一个方法,可以获取客户希望订购的披萨种类private String getType() {try {BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));System.out.println("input pizza 种类:");String str = strin.readLine();return str;} catch (IOException e) {e.printStackTrace();return "";}}}
- 最后调用
//相当于一个客户端,发出订购
public class PizzaStore {public static void main(String[] args) {//使用简单工厂模式new OrderPizza(new SimpleFactory());}}
工厂方法模式
基本介绍
工厂方法模式:定义了一个创建对象的抽象方法**,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。**
设计方案
披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪pizza、北京的胡椒pizza 或者是伦敦的奶酪pizza、 伦敦的胡椒pizza。
工厂方法模式改进的思路:
将披萨项目的实例化功能抽象成抽象方法(OrderPizza),在不同的口味点
餐子类中具体实现(BJOrderPizza\LDOrderPizza)。
- 抽象的OrderPizza.java
public abstract class OrderPizza {//定义一个抽象方法,让各个工厂子类自己实现
abstract Pizza createPizza(String ordertype);//构造器
public OrderPizza() {Pizza pizza = null;String ordertype;
do {ordertype = gettype();pizza = createPizza(ordertype);
if (pizza != null) {pizza.prepare();pizza.bake();pizza.cut();pizza.box();
} else {break;
}
} while (true);}}
- 实现的工厂子类
public class BJOrderPizza extends OrderPizza {@Override
Pizza createPizza(String type) {Pizza pizza = null;
if (type.equals("cheese")) {pizza = new BJCheesePizza();
} else if (type.equals("pepper")) {pizza = new BJPepperPizza();}return pizza;
}}
抽象工厂模式
基本介绍
- 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
- 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
- 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
- 将工厂抽象成两层, AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。 这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
设计思路
- AbsFactory接口
public interface AbsFactory {//让不同的工厂类来实现createPizza方法public Pizza createPizza(String type);
}
- BJFactory实现
public class BJFactory implements
AbsFactory {@Overridepublic Pizza createPizza(String type) {Pizza pizza = null;if (type.equals("cheese")) {pizza = new BJCheesePizza();} else if (type.equals("pepper")) {pizza = new BJPepperPizza();}return pizza;
}}
- OrderPizza 调用AbsFactory接口
public class OrderPizza {AbsFactory factory;
//构造器
public OrderPizza(AbsFactory factory) {setFactory(factory);
}
public void setFactory(AbsFactory factory) {Pizza pizza = null;
String ordertype;
this.factory = factory;
do {ordertype = gettype();
pizza = factory.createPizza(ordertype);
if (pizza != null) {pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {break;}
} while (true);
}}
- PizzaStore 传入具体的LDFactory()
public class PizzaStore {public static void main(String[] args) {// new OrderPizza(new BJFactory());
new OrderPizza(new LDFactory());
System.out.println("退出程序~~");
}}
JDK源码 Calendar类
JDK 中的Calendar类中,就使用了简单工厂模式
createCalendar 根据TimeZone\locale 创建对应的实例
【设计模式】工厂设计模式相关推荐
- 创建设计模式 - 工厂设计模式
创建设计模式 - 工厂设计模式 欢迎到工厂设计模式在Java教程.Factory Pattern是Creational Design模式之一,它在JDK以及Spring和Struts等框架中得到广泛应 ...
- java二十三种设计模式——工厂设计模式
java设计模式的分类 在java中,设计模式有三十三种之多,分为三大类: 创建性模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构性模式,共七种:适配器模式.装饰器模式 ...
- php设计模式-工厂设计模式
概念: 工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤. 很多高级模式都是依赖于工厂模式. 转载于:https://www.cnblogs.com/sjhss ...
- 嵌入式C设计模式---工厂设计模式
更新记录链接:嵌入式C设计模式---前言_嵌入式学习_force的博客-CSDN博客_嵌入式前言 目录 1.工厂设计模式动漫详解 2.智慧温室大棚监控系统项目详解工厂应 ...
- 设计模式:工厂设计模式
通过工厂设计模式可降低代码的耦合度.耦合度太高会导致代码不方便维护 就相当于A一直要与B绑定在一起.可以完全参考Java虚拟机的设计思想 程序→JVM→适应不同的操作系统(A->C->B) ...
- Java设计模式——工厂设计模式
工厂设计模式 一.简介 都不知道简介要写什么,工厂模式嘛,就是工厂嘛,生产东西的嘛-- 在Java里面就是用来帮助我们生产对象的咯-- 主要作用嘛,大概就是将创建和使用对象拆分减低耦合度吧. 二.分类 ...
- java 生产设计模式_java设计模式-工厂设计模式
工厂设计模式是创建型设计模式,有三种设计方法:简单工厂(产品父类),工厂模式(工厂父类),抽象工厂(父类接口) 一.简单工厂 简单工厂的设计思想是: 1.定义一个产品的父类 2.具体产品类继承父类 3 ...
- 设计模式--工厂设计模式
工厂设计模式:四个角色 抽象工厂 具体工厂 抽象产品 具体产品 优点:类的创建方法被封装 满足开闭原则 缺点 每增加一个具体产品都要新加一个工厂 会造成类爆炸 package com.qf.facto ...
- 设计模式—工厂设计模式
工厂设计模式 1.概述 2.简单工厂模式 2.1 结构 2.2 实现 2.3 优缺点 2.4 扩展 3.工厂方法模式 3.1 概述 3.2 结构 3.3 实现 3.4 优缺点 4.抽象工厂模式 4.1 ...
- Java设计模式-工厂设计模式
工厂设计模式概念 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相 ...
最新文章
- 如何用Python实现超级玛丽的人物行走和碰撞检测?
- sql server 2008学习4 设计索引的建议
- AtCoder4515 [AGC030F] Permutation and Minimum(dp)
- 面向对象:MATLAB的自定义类 [MATLAB]
- 【转】如何在eclipse下配置Heritrix
- 分享119个Android手机应用源代码总有一个是你想要的
- uploadify php demo,php uploadify上传
- [乱搞 暴力] BZOJ 1142 [POI2009]Tab
- linux系统怎样将图片导出,Linux 下 将PDF文件中的文本,图片导出的方法。
- HTML5系列(2)history
- 软考倒计时26天,最后冲刺阶段
- 陷波滤波器——周期性降噪
- javascriptji c z s
- 影院体验系列_中国电影博物馆IMAX GT厅_《失控玩家》
- 使用对比学习处理大规模多模态单细胞数据
- 加盟代理闪云科技小程序为创业者带来另一条出路
- 详解pandas的read_csv方法
- linux shell ifs,Shell 的 IFS 变量
- 苹果的名字测试软件,抖音手机称重是什么软件叫什么名字 怎么用iPhone苹果手机称重...
- 软件性能测试方案怎么编写?权威的性能测试报告如何申请?
热门文章
- 【数位DP】HDU3555-Bomb
- 2022 ICPC网络预选赛第二场 J A Game about Increasing Sequences 歪解
- 查看计算机上隐藏用户,Win732位旗舰版系统下如何查看与删除隐藏账户【图】
- 登月源码开源登顶GitHub No.1!接而又被中国程序员“玩坏”了
- YOLO 对象检测 OpenCV 源代码
- 网络客户/服务器程序
- win10安装,ERROR:0x8007025D问题解决
- FileNotFoundException 问题的解决
- Successfully deployed.Backed up previous deployment.
- 《十一月的肖邦》——麦芽糖