工厂方法模式相关知识
-
Android 设计模式之各种工厂方法模式久违的设计模式系列视频。之前写过三篇设计模式。感兴趣的可以看看。单例模式观察者模式策略模式好了,我们开始正式开始介绍工厂方法模式,简单工厂方法模式(静态工厂方法模式),抽象工厂方法模式。部分摘选《Android 源码设计模式 解析与实战》导航1.什么是工厂方法模式,简单工厂方法模式(静态工厂方法模式),抽象工厂方法模式。2.工厂方法模式,简单工厂方法模式,抽象工厂方法模式的区别首先!上例子!小M 是一家汽车厂的厂长,对他来说,组装汽车没什么好神秘的,无非就是将一些零件组装起来,小M的车厂就是负责某款SUV车型,比如Q3,Q5,Q7 小M的车厂有三条产品线。将车抽象出来,将车的公共属性定义在抽象车类里抽象车类每个车分别实现这个接口Q3Q5Q7一种车一个工厂,将工厂的方法抽象出来每种车的工厂实现抽象工厂Q3FactoryQ5FactoryQ7Factory最后组装成了流水线这就是工厂方法模式,主要分4大块,一是抽象工厂,二是具体工厂,三是抽象产品,四是具体产品工厂方法对应每一种产品,都有一种工厂,通过反射的方式
-
设计模式第2弹:工厂方法模式1、 工厂方法模式概述 工厂方法模式是一种创建模式,又被称为虚拟构造子模式(Virtual Constructor)或者多态性工厂模式(Polymoriphoic Factory)。工厂方法模式是目标是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 1.1、 工厂方法模式核心组件 工厂方法模式是在简单工厂模式上的改进,主要包含如下几个角色及组件 抽象工厂(Creator):整个工厂模式的核心角色,它与应用无关,主要在创建模式中规范和产品对应的工厂对象的标准化定义。 具体工厂(Concrete Creator)
-
我的Java设计模式-工厂方法模式女朋友dodo闹脾气,气势汹汹的说“我要吃雪糕”。笔者心里啊乐滋滋的,一支雪糕就能哄回来,不亦乐乎?!雪糕买回来了,她说“不想吃雪糕了,突然想吃披萨”。呵呵了,憋了一股劲“没问题”,又屁颠屁颠的去把披萨买回来。世事难料,dodo同学又放大招了,“披萨太上火了,我要吃芝士蛋糕”。这时候,工厂方法模式该上场了,使用它可以完美的解决不断的产品变更。工厂方法模式是怎么样的?而工厂方法模式又是怎样解决产品变更呢?一起来看看...一、工厂方法模式定义定义一个创建对象的工厂接口,工厂方法将实例化推迟到子类中。定义总是抽象的,先放出工厂方法模式的UML图如下所示:工厂方法模式UML.png从上图可以看出,工厂方法模式涉及到以下四个角色的概念:- 抽象工厂角色:工厂方法模式的核心,创建产品的工厂类必须实现该接口。- 具体工厂角色:该角色实现了抽象工厂接口,具体如何创建产品类就是在该实现类完成。- 抽象产品角色:所有产品类的超类,负责实现产品共性的抽象定义。- 具体产品角色:该角色实现了抽象产品接口,负责具体的不同产品业务逻辑
-
设计模式--工厂模式--工厂方法模式工厂模式有2种:工厂方法模式、抽象工厂模式 *工厂方法模式:一个产品系列 *抽象工厂模式:一个产品族(包含多个系列) 1.工厂方法模式的实现:以华为P8系列为例 - 定义接口 public interface HuaWeiP8SeriesInterface { public void draw(); } - 实现接口 public class P8Young implements HuaWeiP8SeriesInterface { @Override public void draw(){ System.out.println("---------------P8青春版-------------"); } } public class P8Standard implements Hu
工厂方法模式相关课程
工厂方法模式相关教程
- 工厂模式 工厂模式是平时开发过程中最常见的设计模式。工厂模式解决类的实例化问题,它属于创建型模式。工厂模式也经常会和其他设计模式组合使用。试想你去麦当劳买一个汉堡。你只需要告诉收银员要一个xx汉堡。过一会就会有一个此类型的汉堡被制作出来。而你完全不需要知道这个汉堡是怎么被制作出来的。这个例子中你就是客户端代码,麦当劳就是工厂,负责生产汉堡。汉堡是接口,而具体的某一种汉堡,比如说香辣鸡腿堡,就是实现了汉堡接口的类。我们继续通过另外一个例子,深入理解工厂模式。现在我们给某款音乐软件开发一个推荐功能。需求是能够根据用户选择的音乐风格,推荐不同风格的歌曲清单。那么你打算怎么实现呢?
- 抽象工厂模式 抽象工厂模式用来解决产品族的实例化问题。比如说现在有个家居设计软件,通过软件模拟房间,摆放各种虚拟的家具,看效果如何。我们可以放入电视柜、茶几、餐桌、床等等。这一系列的家具就叫做产品族。产品族面临的问题是,当一个产品族切换到另外一个产品族时,如何让代码的修改最小。也就是说如何做到开闭原则。想把设计好的方案从简约现代切换到欧式风格家具,怎么才能做到修改最小?如果采用简单工厂,那么每种产品都对应一个工厂,工厂负责产出不同风格的产品。设计方案中用到 n 种产品就要修改 n 处代码。这显然不是最佳的方法。此时,我们需要抽象工厂模式来解决这个问题。抽象工厂模式中,每个工厂的实现负责生产自己产品族的产品。示意图如下:
- 1.1 工厂模式实现电子地图 首先我们需要一个策略接口,不同策略实现该接口。再搭配一个策略工厂。客户端代码只需要根据用户的出行方式,让工厂返回具体实现即可,由具体的实现来提供算法计算。以工厂模式实现的电子地图代码如下。TravelStrategy接口代码:public interface TravelStrategy { int calculateMinCost();}TravelStrategy接口的实现代码:public class SelfDrivingStrategy implements TravelStrategy { @Override public int calculateMinCost() { return 30; }}TravelStrategyFactory代码:public class TravelStrategyFactory { public TravelStrategy createTravelStrategy(String travelWay) { if ("selfDriving".equals(travelWay)) { return new SelfDrivingStrategy(); } if ("bicycle".equals(travelWay)) { return new BicycleStrategy(); } else { return new PublicTransportStrategy(); } }}TravelService对外提供计算方法,通过工厂生成所需要的 strategy。代码如下:public class TravelService { private TravelStrategyFactory travelStrategyFactory = new TravelStrategyFactory(); public int calculateMinCost(String travelWay) { TravelStrategy travelStrategy = travelStrategyFactory.createTravelStrategy(travelWay); return travelStrategy.calculateMinCost(); }}代码结构和我们上一节讲解的音乐推荐器几乎一模一样。看似也很好地解决了我们的设计问题。接下来我们看看如何用策略模式解决这个问题,然后我们再对两种模式做对比。
- 3. 策略模式与工厂模式结合使用 针对第一个缺点。我们可以通过策略模式与工厂模式结合使用来改进。通过进一步封装,消除客户端代码的条件选择。我们修改一下StrategyContext类,代码如下:public class StrategyContext { private TravelStrategy strategy; public StrategyContext(String travelWay) { if ("selfDriving".equals(travelWay)) { strategy = new SelfDrivingStrategy(); } if ("bicycle".equals(travelWay)) { strategy = new BicycleStrategy(); } else { strategy = new PublicTransportStrategy(); } } public int calculateMinCost(){ return strategy.calculateMinCost(); }}可以看到我们初始化的逻辑和工厂的逻辑很相似。这样条件判断就提炼到 Context 类中了。而客户端代码将会简洁很多,只需要在初始化 StrategyContext 时,传入相应的出行方式即可。代码如下:public class TravelService { private StrategyContext strategyContext; public int calculateMinCost(String travelWay){ strategyContext = new StrategyContext(travelWay); return strategyContext.calculateMinCost(); }}改进后,客户端代码现在已经完全不知道策略对象的存在了。条件判断也被消除了。其实很多时候我们都是通过搭配不同设计模式来达到我们的设计目标的。策略+工厂模式类图如下:
- 6.1 模式的介绍 该模式定义了一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构,它是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
- 2.1 装饰器工厂 装饰器工厂就是一个简单的函数,它返回一个表达式,以供装饰器在运行时调用。通过装饰器工厂方法,可以额外传参,普通装饰器无法传参。function log(param: string) { return function (target: any, name: string, descriptor: PropertyDescriptor) { console.log('target:', target) console.log('name:', name) console.log('descriptor:', descriptor) console.log('param:', param) }}class Employee { @log('with param') routine() { console.log('Daily routine') }}const e = new Employee()e.routine()代码解释:第 1 行,声明的 log() 函数就是一个装饰器函数,通过装饰器工厂这种写法,可以接收参数。来看代码的打印结果:target: Employee { routine: [Function] }name: routinedescriptor: { value: [Function], writable: true, enumerable: true, configurable: true}param: with paramDaily routine可以看到,先执行装饰器函数,然后执行 routine() 函数。至于类属性装饰器函数表达式的三个参数 target、name、descriptor 之后会单独介绍。
工厂方法模式相关搜索
-
g area
gamma函数
gcc 下载
generic
genymotion
gesture
getattribute
getchar
getdocument
getelementbyid
getelementsbytagname
getmonth
getproperty
gets
getty
git clone
git pull
git push f
git 命令
git 使用