工厂模式
液晶显示器工厂模式

如何进入液晶显示器工厂模式时间:2010-11-19 17:05来源:未知作者:飞鸟恋鱼点击:152次进入工厂模式有什么作用?进去后能干什么?你进入过工厂模式吗?1、液晶显示器工厂模式简介1)什么是工厂模式和用户模式现在的显示器大多数采用菜单方式对个别参数进行调节。
用户对上述参数进行调解时的操作模式称为用户模式。
在液晶显示器出厂时,存进入工厂模式有什么作用?进去后能干什么?你进入过工厂模式吗?1、液晶显示器工厂模式简介1)什么是工厂模式和用户模式现在的显示器大多数采用菜单方式对个别参数进行调节。
用户对上述参数进行调解时的操作模式称为‘用户模式’。
在液晶显示器出厂时,存储器内已经存储了“用户模式”的最佳调节参数和一些特殊的参数,特殊参数只有通过特殊方式才能调出,这种只能用特殊方法才能调出参数的模式称为“工厂模式”或“维修模式”。
2)为什么要进入工厂模式有时用户在偶然情况下调出了工厂模式并出于好奇进行了调节,退出后又不知如何进入,使液晶显示器状态发生了变化,用“用户模式”又无法恢复,这时,就需要重新进入“工厂模式”。
在计算机工作过程中,如果周围环境存在较强电磁干扰或信号线太长造成信号在传输过程中衰减过大,这时接收端收到信号就可能发生错误。
当错误率很低或只有个别数据位发生错误时,系统没有检测出来,信号就可能被接受下来,并进行存储,造成液晶显示器在使用过程中亮度、对比度突然减小或颜色突然变乱等无法调整的故障。
这时,也需要进入“工厂模式”进行调整,使其恢复正常数值,但有时进入工厂模式也无法调整,此时只能重写存储器中的内容,同时还要使用专门的编程器进行读写,或更换相同的存储器。
另外,液晶显示器工厂模式中存储着诸如LCD累计使用时间或出场日期,甚至液晶面板类型等重要参数,所以进入工厂模式查看一些相关信息也是验证LCD是否是新品的重要方法,同时也为购买二手液晶显示器的朋友提供了重要的参考价值,因为使用时间越短越值得购买。
简单工厂模式的使用场景与示例

简单工厂模式的使用场景与示例简单工厂模式是一种常见的设计模式,它是一种创建型模式,可以帮助我们根据客户端的需求动态地生成不同的对象。
本文将介绍简单工厂模式的使用场景与示例,以便读者更好地理解和应用该模式。
一、简单工厂模式的基本原理在介绍简单工厂模式的使用场景之前,我们先来了解一下它的基本原理。
简单工厂模式由三个角色组成:工厂类、抽象产品类和具体产品类。
工厂类根据客户端的需求,决定创建哪一种具体产品类的对象,并返回给客户端使用。
二、简单工厂模式的使用场景1. 创建对象时只需要知道其类别,而不需要知道具体的实现。
简单工厂模式可以隐藏具体产品类的创建细节,客户端只需要调用工厂类的方法即可获取所需的对象。
2. 客户端不关心对象的创建过程。
通过简单工厂模式,我们可以将对象的创建逻辑封装在工厂类中,使得客户端完全不需要关心对象的创建过程,只需要关心获取到所需对象即可。
3. 需要一组相关的对象被统一创建。
在某些场景下,我们可能需要一组相关的对象被统一创建,简单工厂模式可以灵活地满足这种需求。
三、简单工厂模式的示例下面通过一个示例来具体介绍简单工厂模式的应用。
假设我们有一个游戏场景中的角色类,包括玩家角色和敌人角色。
我们需要根据不同的角色类型创建对应的角色对象。
首先,我们定义一个抽象角色类(Role),用于表示玩家角色和敌人角色的共有属性和方法,包括姓名(name)和攻击力(attack)。
```javapublic abstract class Role {protected String name;protected int attack;public Role(String name, int attack) { = name;this.attack = attack;}public abstract void display();public abstract void attack();}```接下来,我们定义具体的玩家角色类(PlayerRole)和敌人角色类(EnemyRole),它们分别继承自抽象角色类(Role)。
简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式区别及优缺点各位⼩伙伴好,今天给⼤家主要介绍⼀下简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式的区别及各⾃的优缺点。
(本⽂实现语⾔为Python3)【前⾔】众所周知今天所讲的内容是设计模式的⼀类;对于设计模式这个概念,我想⾸先请⼤家问问⾃⼰:1、什么是设计模式 2、我们为什么要了解并学习设计模式?从我上学的时候我相信⼤家跟我⼀样也接触过设计模式的课程,当时可能懵懵懂懂只是知其然,当时还会想明明可以直接写出来为什么要搞成这样的形式,我就算学会了它到底什么时候能⽤呢?⼀系列的问题...Emm算了到时候再想想(lazy)。
随着实践的不断增多,现在我想可以对这些问题有个初步的回答了: 1、在我看来,设计模式外在看是经过前⼈不断实践总结出的针对某些指定场景极其好⽤的⼀种代码结构设计模板;内在看其实是⼀种设计思想(即为什么他们会这么想,这样想较之其他⽅法有什么好处)。
当我们真正的理解设计思想的时候,就可能会在⾯对问题和场景时⾃然⽽然的灵活运⽤到多种设计模式,⽽不是单⼀的刻板结构。
2、在⼯程化的开发中,需求往往是会不断变化的,这也是让很多开发⼈员及其烦躁的地⽅,所以才会有开发与产品的亲密关系。
设计模式就是为了抵御外部需求变化产⽣的。
设计模式应符合开闭原则(类、模块和函数等应该对扩展开放,对修改关闭。
)⼀个好的设计在之后的开发中,包括发⽣重⼤需求变化的时候,往往代码只需要进⾏简单重构去进⾏适配,⽽不是通过打补丁的⽅式去堆砌,也很容易避免破窗效应,充分的发挥了灵活的扩展和适配,⼤⼤增强了维护性。
综上所述,我们了解并学习设计模式,可以使我们的代码变得更加健壮、结构清晰,可以从容、灵活的适配需求变更(可复⽤、可扩展、可维护、够灵活)【正⽂】⾸先,这三种模式解决的问题是实例化对象的问题;那么为什么不直接实例化⽽⽤这样的⼯⼚形式去实例化对象呢?因为【待实例化对象太多(⼦类多且变动、调⽤频繁)或者实例化对象的过程、准备⽐较复杂】,直接实例化意味着每次都⽤重复的去执⾏实例化这个操作,如果有很多待实例化的操作,那么就要重复执⾏很多次,更不要说万⼀在实例化之前还要执⾏⼀堆配置项的初始化。
各品牌电视机工程模式进入方法

康佳最新电视工厂模式:激活与退出操作进入:操作遥控器,按一下[MENU菜单]按钮,画面弹出普通功能设置菜单。
这时连续点按5次[回看]按钮,即可打开康佳彩电工厂模式菜单。
退出:只需在设置完以后点一下[回看]按钮即可退出,返回到正常电视画面。
松下TH-50PZ700C等离子:1、打开电视机2、按着电视机前面板上“功能”键将其切换到音量,再按“-”键不动,同时按遥控器上“显示”键三次(这时出现第一个表)3、按遥控器上2(出现第二个表),再按“确定”键(出现第三个表);4、按遥控器上功能键“下键”将光标移动到最下一行上,再按遥控器上功能键“右键”将光标移动到右边一行上5、按“消音”键3秒钟,就看到开机时间和开机次数了6、按电视机开关即可退出LG等离子进入工程模式同时按住遥控器和电视机上的menu键几秒后就进入了今打4008199999问的,初始密码是0000,如果进不去的话,就打这个电话。
告诉他们机器的串号,他们帮忙查LG 42LC2R 液晶工程菜单跟他的等离子电视一样,同时按住遥控器和主机上的MENU大约5-10秒后就出现了.松下等离子: 1、把音量关到零; 2、 2按遥控器上的menu键,屏幕上出现菜单,进入设置,在定时关机那项随便选择一个时间; 3、同时按下遥控器上的呼出钮(见说明书,就是数字键0左边哪个啦)和电视上的频道减键松下等离子:1、把音量关到零;2、 2按遥控器上的menu键,屏幕上出现菜单,进入设置,在定时关机那项随便选择一个时间;3、同时按下遥控器上的呼出钮(见说明书,就是数字键0左边哪个啦)和电视上的频道减键(注意是电视机上,不是遥控器上啊,屏幕下,按一下,面板就打开了),屏幕上出现service 1 ;4、再同时按下遥控器上的静音键和电视上的频道减键((注意是电视机上,不是遥控器上啊,屏幕下,按一下,面板就打开了)),屏幕上出现service 25、按下数字键3即可6、屏幕上出现英文hour(小时),下面的就是工作时间7、退出时该怎么操作方式关机即可(关断电视机上的电源钮)进东芝C3000C系列工程菜单的方法进东芝C3000C系列工程菜单的方法:在开机状态下,同时按电视面板上的MENU键和遥控器上的静音键,即可调出工程菜单。
什么是工厂模式?

什么是⼯⼚模式?什么是⼯⼚模式?⼯⼚模式是⼀种⽤来创建对象的设计模式。
我们不暴露对象创建的逻辑,⽽是将逻辑封装在⼀个函数内,那么这个函数可以成为⼯⼚。
⼯⼚模式根据抽象程度的不同可以分为:1.简单⼯⼚ 2.⼯⼚⽅法 3.抽象⼯⼚简单⼯⼚:let factory = function (role) {function superman() { ='超级管理员',this.role = ['修改密码', '发布消息', '查看主页']}function commonMan() { = '普通游客',this.role = ['查看主页']}switch(role) {case 'superman':return new superman();break;case 'man':return new commonMan();break;default:throw new Error('参数错误')}}let superman = factory('superman');let man = factory('man');在上述代码中,factory就是⼀个简单的⼯⼚,该⼯⼚中有⼆个构造函数分别对应不同的权限。
我们只需要传递相应的参数就可以获取⼀个实例对象了。
⼯⼚内部的构造函数有相似的地⽅,还可以进⼀步优化。
let factory = function (role) {function User(obj) { = ;this.role = obj.role;}switch(role) {case 'superman':return new User({ name: '平台⽤户', role: ['主页', '登录页'] })break;case 'man':return new User({ name: '游客', role: ['登录页']})break;default:throw new Error('参数错误')}}let superman = factory('superman');let man = factory('man');简单⼯⼚的优点: 你只需要传递⼀个合法的参数,就可以获取到你想要的对象,⽽⽆需知道创建的具体的细节。
AOC显示器进入工厂模式

AOC显示器进入工厂模式(调试机型:197V+)
AOC显示器进入工厂模式比较复杂,首先需要按住显示器MENU按钮,拔掉显示器后面的电源线,再插上。
进入显示器MENU菜单,会发现菜单会移到左上角(普通模式是在正中),并且菜单会多一个“F”的功能选项,进入F项即可以看见工厂模式。
在正中我们看到20070601是表明显示器的生产日期是2007年6月1日。
选择“Auto COLOR”,即可恢复工厂模式下你调节过的色彩。
菜单的左下角,出现的HSD代表的是面板厂商是瀚宇彩晶。
如今AOC主要使用的也包括奇美、三星和LG Display。
明基显示器进入工厂模式(调试机型:G900HD)
明基显示器的工厂模式也比较容易进入,只要在关机时按住MENU键不放同时开机,再按MENU键即可进入。
在工厂模式中,我们看到了代工厂(Vender)和集成芯片型号(Scaler)的信息,面板是SEC(Samsung Electronics Corporation)也就是三星的面板。
其实Monitor On Time是面板点亮时间,Backlight On Time是背光点亮时间。
工厂模式的三种形式
⼯⼚模式的三种形式简单⼯⼚模式-Simple Factory Patter在简单⼯⼚模式结构图中包含如下⼏个⾓⾊:● Factory(⼯⼚⾓⾊):⼯⼚⾓⾊即⼯⼚类,它是简单⼯⼚模式的核⼼,负责实现创建所有产品实例的内部逻辑;⼯⼚类可以被外界直接调⽤,创建所需的产品对象;在⼯⼚类中提供了静态的⼯⼚⽅法factoryMethod(),它的返回类型为抽象产品类型Product。
● Product(抽象产品⾓⾊):它是⼯⼚类所创建的所有对象的⽗类,封装了各种产品对象的公有⽅法,它的引⼊将提⾼系统的灵活性,使得在⼯⼚类中只需定义⼀个通⽤的⼯⼚⽅法,因为所有创建的具体产品对象都是其⼦类对象。
● ConcreteProduct(具体产品⾓⾊):它是简单⼯⼚模式的创建⽬标,所有被创建的对象都充当这个⾓⾊的某个具体类的实例。
每⼀个具体产品⾓⾊都继承了抽象产品⾓⾊,需要实现在抽象产品中声明的抽象⽅法。
⼯⼚⽅法模式-Factory Method Pattern● Product(抽象产品):它是定义产品的接⼝,是⼯⼚⽅法模式所创建对象的超类型,也就是产品对象的公共⽗类。
● ConcreteProduct(具体产品):它实现了抽象产品接⼝,某种类型的具体产品由专门的具体⼯⼚创建,具体⼯⼚和具体产品之间⼀⼀对应。
● Factory(抽象⼯⼚):在抽象⼯⼚类中,声明了⼯⼚⽅法(Factory Method),⽤于返回⼀个产品。
抽象⼯⼚是⼯⼚⽅法模式的核⼼,所有创建对象的⼯⼚类都必须实现该接⼝。
● ConcreteFactory(具体⼯⼚):它是抽象⼯⼚类的⼦类,实现了抽象⼯⼚中定义的⼯⼚⽅法,并可由客户端调⽤,返回⼀个具体产品类的实例。
与简单⼯⼚模式相⽐,⼯⼚⽅法模式最重要的区别是引⼊了抽象⼯⼚⾓⾊,抽象⼯⼚可以是接⼝,也可以是抽象类或者具体类抽象⼯⼚模式-Abstract Factory Pattern● AbstractFactory(抽象⼯⼚):它声明了⼀组⽤于创建⼀族产品的⽅法,每⼀个⽅法对应⼀种产品。
工厂模式的作用,为什么要用工厂模式?
⼯⼚模式的作⽤,为什么要⽤⼯⼚模式?⼯⼚模式的实现⽅式和原理都不难理解和掌握。
但是,在学习完之后,发现⽹上给的例⼦,根本体现不了⼯⼚模式的作⽤。
先不说存在有的例⼦本⾝就是错误的,主要是例⼦中的代码太简单,可以说没必要⽤⼯⼚模式,只不过是为了说明实现⽅式和原理。
所以,会产⽣⼀种错觉:还不如直接new ⼀个对象来的⽅便,有效。
的确,设计模式本⾝就有其适⽤的场景,并不是滥⽤的,否则还不如不⽤。
现在,我记录⼀下在翻阅⼀些资料后,⾃⼰的理解。
⾸先,⼯⼚模式是为了解耦:把对象的创建和使⽤的过程分开。
就是Class A 想调⽤ Class B ,那么A只是调⽤B的⽅法,⽽⾄于B的实例化,就交给⼯⼚类。
其次,⼯⼚模式可以降低代码重复。
如果创建对象B的过程都很复杂,需要⼀定的代码量,⽽且很多地⽅都要⽤到,那么就会有很多的重复代码。
我们可以这些创建对象B的代码放到⼯⼚⾥统⼀管理。
既减少了重复代码,也⽅便以后对B的创建过程的修改维护。
(当然,我个⼈觉得也可以把这些创建过程的代码放到类的构造函数⾥,同样可以降低重复率,⽽且构造函数本⾝的作⽤也是初始化对象。
不过,这样也会导致构造函数过于复杂,做的事太多,不符合java 的设计原则。
)由于创建过程都由⼯⼚统⼀管理,所以发⽣业务逻辑变化,不需要找到所有需要创建B的地⽅去逐个修正,只需要在⼯⼚⾥修改即可,降低维护成本。
同理,想把所有调⽤B的地⽅改成B的⼦类B1,只需要在对应⽣产B的⼯⼚中或者⼯⼚的⽅法中修改其⽣产的对象为B1即可,⽽不需要找到所有的new B()改为new B1()。
另外,因为⼯⼚管理了对象的创建逻辑,使⽤者并不需要知道具体的创建过程,只管使⽤即可,减少了使⽤者因为创建逻辑导致的错误。
举个例⼦:⼀个数据库⼯⼚:可以返回⼀个数据库实例,可以是mysql,oracle等。
这个⼯⼚就可以把数据库连接需要的⽤户名,地址,密码等封装好,直接返回对应的数据库对象就好。
不需要调⽤者⾃⼰初始化,减少了写错密码等等这些错误。
常用设计模式和应用场景
常用设计模式和应用场景
常用设计模式和应用场景
1、工厂模式
工厂模式是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。
应用场景:通常需要创建多种不同类型的对象,并且希望客户端不需要知道对象的具体类型,可以使用工厂模式。
2、策略模式
策略模式(Strategy Pattern)定义一系列算法,将每一个算法封装起来,并让它们可以互换。
策略模式让算法独立于使用它的客户而变化,也称为政策模式。
应用场景:当一个对象的行为或算法可能有多种实现时,可以使用策略模式,将每一种算法封装成一个类,从而使得算法可以相互替换。
3、观察者模式
观察者模式(Observer Pattern)定义对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
应用场景:当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象有待改变时,可以使用观察者模式。
4、单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。
这种类型的设计模式属于创建型模式,它提供了一种创建对象
的最佳方式。
应用场景:当需要保证一个类只有一个实例存在时,可以使用单例模式。
工厂模式百度百科
编程开发工厂模式定义:实例化对象,用工厂方法代替new操作.为何使用?工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。
为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
我们以类Sample为例,如果我们要创建Sample的实例对象:Sample sample=new Sample();可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋值查询数据库等。
首先,我们想到的是,可以使用Sample的构造函数,这样生成实例就写成: Sample sample=new Sample(参数);但是,如果创建sample实例时所做的初始化工作不是像赋值这样简单的事,可能是很长一段代码,如果也写入构造函数中,那你的代码很难看了(就需要Refactor重整)。
为什么说代码很难看,初学者可能没有这种感觉,我们分析如下,初始化工作如果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有背于Java面向对象的原则,面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装”起来(减少段和段之间耦合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。
在本例中,首先,我们需要将创建实例的工作与使用实例的工作分开, 也就是说,让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。
这时我们就需要Factory工厂模式来生成对象了,不能再用上面简单new Sample(参数)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工厂模式 一、引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)看来这人比较爱国,没有日本车),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!", 坐上Bmw后他说"开宝马车!",坐上Audi后他说"开奥迪车!"。你一定说:这人有病!直接说开车不就行了?! 而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是,这种有病的现象在OO语言中可以避免了。下面以Java语言为基础来引入我们本文的主题:工厂模式!!
二、简介 工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类: 1. 简单工厂模式(Simple Factory) 2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory) 这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。下面是使用工厂模式的两种情况: 1.在编码时不能预见需要创建哪种类的实例。 2.系统不应依赖于产品类实例如何被创建、组合和表达的细节。
三、简单工厂模式 顾名思义,这个模式本身很简单,而且使用在业务较简单的情况下。 它由三种角色组成(关系见下面的类图): 1、 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。 2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。 3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。 那么简单工厂模式怎么用呢?我来举个例子吧,我想这个比讲一大段理论上的文字描述要容易理解的多!下面就来给那个暴发户治病: 在使用了简单工厂模式后,现在暴发户只需要坐在车里对司机说句:"开车"就可以了。来看看怎么实现的: //抽象产品角色 public interface Car{ public void drive(); } //具体产品角色 public class Benz implements Car{ public void drive(){ System.out.println("Driving Benz "); } } public class Bmw implements Car{ public void drive(){ System.out.println("Driving Bmw "); } }
。。。(奥迪我就不写了) //工厂类角色 public class Driver{ //工厂方法 //注意 返回类型为抽象产品角色 public static Car driverCar(String s)throws Exception { //判断逻辑,返回具体的产品角色给Client if(s.equalsIgnoreCase("Benz")) return new Benz(); else if(s.equalsIgnoreCase("Bmw")) return new Bmw(); ...... else throw new Exception(); ...... } } //欢迎暴发户出场...... public class Magnate{ public static void main(String[] args){ try{ //告诉司机我今天坐奔驰 Car car = Driver.driverCar("benz"); //下命令:开车 car.drive(); ...... } } } 如果将所有的类放在一个文件中,请不要忘记只能有一个类被声明为public。 程序中类之间的关系如下:
这便是简单工厂模式了。下面是其好处: 首先,使用了简单工厂模式后,我们的程序不在“有病”,更加符合现实中的情况;而且客户端免除了直接创建产品对象的责任,而仅仅负责“消费”产品(正如暴发户所为)。 下面我们从开闭原则上来分析下简单工厂模式。当暴发户增加了一辆车的时候,只要符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。那么对于产品部分来说,它是符合开闭原则的--对扩展开放、对修改关闭;但是工厂部分好像不太理想,因为每增加一辆车,都要在工厂类中增加相应的商业逻辑和判断逻辑,这显然是违背开闭原则的。 对于这样的工厂类(在我们的例子中是为司机师傅),我们称它为全能类或者上帝类。 我们举的例子是最简单的情况,而在实际应用中, 很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝类坏了,进而累坏了我们可爱的程序员。 正如我前面提到的简单工厂模式适用于业务简单的情况下。而对于复杂的业务环境可能不太适应阿。这就应该由工厂方法模式来出场了!!
四、工厂方法模式 先来看下它的组成吧: 1、抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 2、具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产 品的对象。在java中它由具体的类来实现。 3、抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。 4、具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。 用类图来清晰的表示下的它们之间的关系:
我们还是老规矩使用一个完整的例子来看看工厂模式各个角色之间是如何来协调的。话说暴发户生意越做越大,自己的爱车也越来越多。这可苦了那位司机师傅了,什么车它都要记得维护,都要经过他来使用!于是暴发户同情他说:看你跟我这么多年的份上,以后你不用这么辛苦了,我给你分配几个人手,你只管管好他们就行了!于是,工厂方法模式的管理出现了。代码如下: //抽象产品角色,具体产品角色与简单工厂模式类似,只是变得复杂了些,这里略。 //抽象工厂角色 public interface Driver{ public Car driverCar(); } public class BenzDriver implements Driver{ public Car driverCar(){ return new Benz(); } } public class BmwDriver implements Driver{ public Car driverCar() { return new Bmw(); } } ......//应该和具体产品形成对应关系,这里略... //有请暴发户先生 public class Magnate{ public static void main(String[] args) { try{ Driver driver = new BenzDriver(); Car car = driver.driverCar(); car.drive(); }catch(Exception e){ } } } 工厂方法使用一个抽象工厂角色作为核心来代替在简单工厂模式中使用具体类作为核心。让我们来看看工厂方法模式给我们带来了什么?使用开闭原则来分析下工厂方法模式。当有新的产品(即暴发户的汽车)产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。看来,工厂方法模式是完全符合开闭原则的! 使用工厂方法模式足以应付我们可能遇到的大部分业务需求。但是当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的。所以我建议在这种情况下使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。 当然特殊的情况,就要特殊对待了:对于系统中存在不同的产品树,而且产品树上存在产品族,那么这种情况下就可能可以使用抽象工厂模式了。 五、小结 让我们来看看简单工厂模式、工厂方法模式给我们的启迪:如果不使用工厂模式来实现我们的例子,也许代码会减少很多--只需要实现已有的车,不使用多态。但是在可维护性上,可扩展性上是非常差的(你可以想象一下,添加一辆车后要牵动的类)。因此为了提高扩展性和维护性,多写些代码是值得的。
六、抽象工厂模式 先来认识下什么是产品族:位于不同产品等级结构中,功能相关联的产品组成的家族。如果光看这句话就能清楚的理解这个概念,我不得不佩服你啊。还是让我们用一个例子来形象地说明一下吧。 图中的BmwCar和BenzCar就是两个产品树(产品层次结构);而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和BenzSportsCar也是一个产品族。 回到抽象产品模式的话题上,可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可 以创建多个产品族中的产品对象。而且使用抽象工厂模式还要满足一下条件: 1.系统中有多个产品族,而系统一次只可能消费其中一族产品 2.同属于同一个产品族的产品以其使用。 来看看抽象工厂模式的各个角色(和工厂方法的如出一辙): 抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。