php 工厂模式式

经验1613 米
在线时间74 小时
版本5.2.13
积分 1932, 距离下一级还需 68 积分
积分 1932, 距离下一级还需 68 积分
机型红米Note WCDMA版
MIUI版本5.2.13
<font color="#、“电源键”+“音量下键”无法进recovery,画面显示白色小米标志,而且标志会一闪一闪(开机状态从系统更新处选择重启进recovery是可以进的去的)
<font color="#、还有“电源键”+“音量上键”,可进入工厂模式,但是按画面提示音量上键为确认键,音量下键为选择键
可是我实际操作音量上键为选择键,音量下键和电源键按了均无反应,还有三个虚拟键也无反应
已有&1&人评分
精品文章^_^
我刚买的红米NOTE联通增强版.
经验25439 米
威望201 米
在线时间1743 小时
版本5.2.13
有BUG请发帖@
机型红米Note-TD版
签到次数91
MIUI版本5.2.13
目前联通版的RE有点问题,一般机友都是在系统更新哪里进入的,请等待修复此问题
经验1613 米
在线时间74 小时
版本5.2.13
积分 1932, 距离下一级还需 68 积分
积分 1932, 距离下一级还需 68 积分
机型红米Note WCDMA版
MIUI版本5.2.13
目前联通版的RE有点问题,一般机友都是在系统更新哪里进入的,请等待修复此问题 ...
那工厂模式呢?
经验1350 米
在线时间155 小时
版本5.2.13
积分 1553, 距离下一级还需 447 积分
积分 1553, 距离下一级还需 447 积分
机型红米手机 WCDMA版
签到次数37
MIUI版本5.2.13
红米系列真是多灾多难, 尽管卖的很好,就是得不到重视, 不用心做又何必出呢
经验1422 米
在线时间50 小时
版本5.2.13
积分 1478, 距离下一级还需 522 积分
积分 1478, 距离下一级还需 522 积分
机型红米Note WCDMA版
签到次数107
MIUI版本5.2.13
通过手机发布
的确是,我也发现这个问题了~同求开发版解决~
经验26038 米
在线时间2452 小时
版本5.2.13
我是大水逼
机型小米Note
签到次数71
MIUI版本5.2.13
通过手机发布
经验606 米
在线时间89 小时
版本V6.3.10.0.KXECNBL
一夜三十次郎
积分 851, 距离下一级还需 1149 积分
积分 851, 距离下一级还需 1149 积分
机型小米Note
MIUI版本V6.3.10.0.KXECNBL
通过手机发布
软件升级里面进入
经验26038 米
在线时间2452 小时
版本5.2.13
我是大水逼
机型小米Note
签到次数71
MIUI版本5.2.13
MTK芯片的问题
你这签名档不错。&
在线时间2 小时
版本JHDCNBA17.0.1
积分 35, 距离下一级还需 15 积分
积分 35, 距离下一级还需 15 积分
机型红米Note WCDMA版
MIUI版本JHDCNBA17.0.1
我也是这样,我还以为我的机器有问题呢。
经验229 米
在线时间4 小时
版本JHDCNBL39.0
积分 241, 距离下一级还需 259 积分
积分 241, 距离下一级还需 259 积分
机型红米Note WCDMA版
MIUI版本JHDCNBL39.0
一样的问题
已关注极客秀微信
已关注微信
关注腾讯微博
已关注腾讯微博
关注新浪微博
已关注新浪微博
MIUI 2000万
MIUI 2000万发烧友纪念勋章
MIUI三周年
MIUI三周年纪念勋章
百万壁纸评审纪念勋章
MIUI V5内测元勋
MIUI V5内测元勋勋章
MIUI6 荣誉勋章
MIUI6 荣誉勋章
1000万用户纪念勋章
MIUI1000万用户纪念勋章
MIUI 100周
100周发布纪念勋章
MIUI 3000万
MIUI 3000万发烧友纪念勋章
Copyright (C) 2014 MIUI 京ICP备号后使用快捷导航没有帐号?
昨天在小米天猫上抢了一个1s移动版,今天收到了,进入工厂模式(音量上+电源键)的时候发现跟手上原来那个红米的不一样,不知道1s是不是就是这样,而且进入“硬件设备信息”里面以后退不出来,什么键都不管用,只能摘电池。进别的界面没这个问题。
帖子中提到的商品
发烧级手机控(Lv3)
刚才怎么图片没传上去啊
另外系统是MIUI-JHFCNBE10.0
组图打开中,请稍候......
发烧级手机控(Lv3)
顶一下,没人知道吗& && && && && && && && && && && && &
神仙级手机控(Lv5)
我的系统是MIUI-JHFCNBC6.0啊,生产日期2014.6
发烧级手机控(Lv3)
我的系统是MIUI-JHFCNBC6.0啊,生产日期2014.6
我的也是2014.6的,南京生产的,前天6.18抢的,你的工厂模式的界面也是这样的吗?
骨灰级手机控(Lv4)
有学习一个知识,工厂模式(音量上+电源键)
发烧级手机控(Lv3)
顶一下,有没有大神啊
发烧级手机控(Lv3)
来自手机版
我想问问你们手机屏幕底部发暗吗?
发烧级手机控(Lv3)
再顶一下,有红米1s的都没进过工厂模式吗
神仙级手机控(Lv5)
我的系统是MIUI-JHFCNBC6.0
发烧级手机控(Lv3)
顶一下,没人知道吗 .............................
高级手机控(Lv2)
#在这里快速回复#是这样,而且进入“硬件设备信息”里面以后退不出来,
版块推荐百宝箱
小米电视迎新春,玩微信游戏赢大奖啦。在春节期间扫描二维码关注小米电视官方微信,参与游戏即有机会赢取小米电视2,小米小盒子等丰厚礼物。
票选小米2015央视春晚广告 ,一个是史上最羊气十足的广告,一个是史上最时尚潮流的广告,你来决定春晚广告播哪个,参与抢楼还有实物奖励!
回家的旅途你怎么度过,你的小米手机里都准备了什么好玩的应用和游戏,赶紧来跟我们分享一下吧,我们准备了小米小盒子等丰厚的奖品等着你!
小米手机ROM
本周推荐度
MIUI 5.2.13
小米官方精品配件
京ICP证110507号 京ICP备号 京公网安备号创维电视如何进入工厂模式?-广州创维电视维修中心
   栏目导航
   联系我们
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& >
> 创维电视如何进入工厂模式?
进入工厂模式
1.首次进入工厂模式:按住键控板上菜单键不放,再依次按遥控器上“1”.“5”.“9”键即可进入工厂模式。
2.批量生产时母片设置为工厂模式状态,无须上述操作,直接按工厂遥控器上快捷键即可进入工厂调试菜单。
调试项目选择方法
翻页:进入工厂菜单,按“频道+/-”键选中菜单最上面的832/828 SERVICE MENU **;用音量键即可翻页。
选中及更改:按“频道+/-”键选择可调项目,选中的为红色,用音量键更改数据.
退出工厂模式
进入工厂模式832/828 SERVICE MENU 00,使 “PROD.ON 1”改成“0”后,按下遥控器“菜单键”退出工厂模式;
5Y30工厂菜单一览表
调整项名称
L768XX对应名称
行同步与行回扫相位调整
场输出直流偏置调整
场输出幅度调整
.V .LINE/50
场输出线性调整
场输出S-校正调整
节目号选择
工厂模式开/关
红枪输出直流偏置调整
绿枪输出直流偏置调整
蓝枪输出直流偏置调整
红枪输出增益调整
绿枪输出增益调整
蓝枪输出增益调整
场输出开/关
RGB输出直流偏置调整
亮度最大限制
屏显对比度调整
屏显水平位置调整
屏显垂直位置调整
行消隐调整(左侧)
行消隐调整(右侧)
RF AGC延迟
东西校正行副调整
East/West DC
东西校正枕形调整(50HZ)
East/West AMP
东西校正枕形调整(60HZ)
East/West AMP
东西校正梯形调整
East/West Tilt
东西校正上边角调整
East/West Comer TOP
东西校正下边角调整
East/WestComerBottom
行幅补偿调整(50HZ)
行幅补偿调整(60HZ)
交流电压150V基准
交流电压270V基准
交流电压显示开关
交流电压保护开关
重低音选项
无信号蓝屏/屏保
开机拉幕速度慢/快
彩色制式PAL无/有
彩色制式NTSC 3.58无/有
彩色制式NTSC 4.43无/有
伴音制式D/K无/有
伴音制式B/G无/有
伴音制式I无/有
伴音制式M/N无/有
关机拉幕 无/有
无AV/1路AV /2路AV
色调中心值调整
屏显语言 中英文/英文
健康互动平台关/开
数码工作站关/开
开机拉幕 无/有
开机拉幕延迟
16:9 东西校正枕形偏差50HZ
16:9东西校正枕形偏差60HZ
6:19东西校正枕形偏差60HZ
6:19东西校正枕形偏差60HZ
屏保右侧位置
DVD底色调整
DVD 底色调整
Hor.firstLoopGain&H-syncGatingon/off
AFC gain&gate
行频调整(仅对ES芯片有效)
视频输出开/关
Video.Mute
行输出 正常/强制内部自由振荡
场同步分离灵敏度 正常/提高
场幅亮度补偿调整
场频标准选择
OUNT.DOWN.MODE
屏显半透明亮度调整
屏显半透明 关/开
Half tone Def
RGB输出信号消隐 开/关
LA768XX音频输出开选择
亮度信号‘核化’关1,2,3
Coring Gain
亮度通道陷波器/色度通道滤波器选择
Filter.sys
内置测试信号 白电平100%/60%
内置测试信号 正常/黑屏/白屏/十字
G-Y 角度 240/253
自动消色启动点调整-30db..-40db
Color Kille r ope.
场消隐控制 正常/宽幕
行消隐信号 内部??/font&/与行回扫或逻辑
LA768XX 35脚输出开关
Fsc or Csync
预过冲/过过冲调整 窄..宽
Pre-shoot adj.
‘核化’增益调整 最小…最大
Coring gain
Y gamma 关/开 (最小…最大)
Y Gamma Start
亮度直流恢复调整100%…145%
黑电平扩展起始点调整40IRE..60IRE
Blk.Str.Start
黑电平扩展增益调整 最小..最大
Blk.Str.Gain
肤色校正 关/开
Auto.Flesh
色度信号选择 视频/色度
色度通道带通滤波器 开/关
自动消色电路 自动/无消色
自动消色电路 工作/禁止
C_KILL OFF
屏显插入信号 模拟方式/数字方式
Diital OSD
亮度ABL 开/关
Brt.Abl.Def
亮度ABL有效范围限制 开/关
Mid.Sto.Def
RGB输出直流温度特性选择-1Vbe/flat
RGB Temp SW
亮度ABL启动点调整
Bright Abl.Threshold
R-Y、B-Y 调制比调整
R-Y/B-Y Gain Balance
R-Y、B-Y 调制角调整
R-Y/B-Y Angle
B-Y 直流电平调整
B-Y DC Level
R-Y 直流电平调整
R-Y DC Level
OVER.MOD.SW
音量控制DAC平滑滤波器 开/关
伴音去加重时间常数 50us/75us
图像中频选择38M/38.9M/45.75M/58.75M
VIF.Sys.SW
伴音中频选择
SIF.Sys.SW
伴音调频调制比选择900mvrms 50khz/25khz
VIDEO.LEVEL
视频输出幅度调整2.0vp-p+/-0.1vp-p
音频输出幅度调整900mvrms+/-10mv
预过冲/过过冲选择
Pre/Over SW
色副载波振荡频率调整-/+选择
C.VCO ADJ.SW
色副载波振荡频率调整
C.VCO Adjust
Tint.Through
VIDEO LEVEL OFFSET
OVER MOD LEVEL
&|&版权所有 |
报修电话:020- 客服热线:您的位置: >
> HTC机型进入工程模式HTC机型进入工程模式Hboot模式
取出手机电池5秒再装入(部分),手机关机状态下,保持按住音量下键和开机键,进入Hboot模式后松手;
或者使用甜椒助手--实用工具--进入Hboot。
特殊机型:照相键+开机键(HTC G1)
---------------------------------------------------------------------------------
Fastboot模式
使用甜椒助手--实用工具--进入Fastboot;
或者手动进入:
1.首先进入Hboot模式
取出手机电池5秒再装入(部分),手机关机状态下,保持按住音量下键和开机键,进入Hboot模式后松手;
2.音量键使蓝色框选中"FASTBOOT"(默认即是),然后再按一下电源键,进入Fastboot界面,如下图所示:
特殊机型:返回键+开机键(HTC G1)
---------------------------------------------------------------------------------
Recovery模式
使用甜椒助手--实用工具--进入Recovery;
或者手动进入:
1.首先进入Hboot模式
取出手机电池5秒再装入(部分),手机关机状态下,保持按住音量下键和开机键,进入Hboot模式后松手。
2.音量键使蓝色框选中"RECOVERY",然后再按一下电源键,进入Recovery界面
官方recovery为绿色小机器人或者叹号,按住音量加键和开机键,出现如下界面:
第三方recovery界面:
特殊机型:Home键+电源键(HTC G1),进入Recovery;如果是官方Recovery,则通过ALT+L键调出菜单
分享到 : 您还没有昵称哦!您还没有邮箱哦!您还没有评论哦!感谢您的参与!昵称:邮箱:回复邮件通知关于栏目入口甜椒实验室关注我们服务热线:400-702-1168 ()
您好,访客
||||||||||
C#设计模式编程之抽象工厂模式新解
发布时间: 08:00:00&&来源:&&作者:&&点击:375
  概述   在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。   意图  提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。  模型图  逻辑模型:
  物理模型:
  生活中的例子  抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类。这种模式可以汽车制造厂所使用的金属冲压设备中找到。这种冲压设备可以制造汽车车身部件。同样的机械用于冲压不同的车型的右边车门、左边车门、右前挡泥板、左前挡泥板和引擎罩等等。通过使用转轮来改变冲压盘,这个机械产生的具体类可以在三分钟内改变。
  抽象工厂之新解  虚拟案例  中国企业需要一项简单的财务计算:每月月底,财务人员要计算员工的工资。  员工的工资 = (基本工资 + 奖金 - 个人所得税)。这是一个放之四海皆准的运算法则。  为了简化系统,我们假设员工基本工资总是4000美金。  中国企业奖金和个人所得税的计算规则是:  奖金 = 基本工资(4000) * 10%  个人所得税 = (基本工资 + 奖金) * 40%  我们现在要为此构建一个软件系统(代号叫Softo),满足中国企业的需求。  案例分析  奖金(Bonus)、个人所得税(Tax)的计算是Softo系统的业务规则(Service)。  工资的计算(Calculator)则调用业务规则(Service)来计算员工的实际工资。  工资的计算作为业务规则的前端(或者客户端Client)将提供给最终使用该系统的用户(财务人员)使用。  针对中国企业为系统建模  根据上面的分析,为Softo系统建模如下:
  则业务规则Service类的代码如下:
1using S23namespace ChineseSalary4{5 /**//// <summary&6 /// 公用的常量7 /// </summary&8 public class ConstantArray {10 public static double BASE_SALARY = 4000;11 }12}1using S23namespace ChineseSalary4{5 /**//// <summary&6 /// 计算中国个人奖金7 /// </summary&8 public class ChineseBonusArray {10 public double Calculate()11 {12 return Constant.BASE_SALARY * 0.1;13 }14 }15}16  客户端的调用代码:
1using S23namespace ChineseSalary4{ 5 /**//// <summary&6 /// 计算中国个人所得税7 /// </summary&8 public class ChineseTaxArray {10 public double Calculate()11 {12 return (Constant.BASE_SALARY + (Constant.BASE_SALARY * 0.1)) * 0.4;13 }14 }15}16  运行程序,输入的结果如下:  Chinese Salary is:2640  针对美国企业为系统建模  为了拓展国际市场,我们要把该系统移植给美国公司使用。 美国企业的工资计算同样是: 员工的工资 = 基本工资 + 奖金 - 个人所得税。  但是他们的奖金和个人所得税的计算规则不同于中国企业:  美国企业奖金和个人所得税的计算规则是:  奖金 = 基本工资 * 15 %  个人所得税 = (基本工资 * 5% + 奖金 * 25%)   根据前面为中国企业建模经验,我们仅仅将ChineseTax、ChineseBonus修改为AmericanTax、AmericanBonus。 修改后的模型如下:
  则业务规则Service类的代码如下:
1using S23namespace AmericanSalary4{5 /**//// <summary&6 /// 公用的常量7 /// </summary&8 public class ConstantArray {10 public static double BASE_SALARY = 4000;11 }12}131using S23namespace AmericanSalary4{5 /**//// <summary&6 /// 计算美国个人奖金7 /// </summary&8 public class AmericanBonusArray {10 public double Calculate()11 {12 return Constant.BASE_SALARY * 0.1;13 }14 }15}161using S23namespace AmericanSalary4{ 5 /**//// <summary&6 /// 计算美国个人所得税7 /// </summary&8 public class AmericanTaxArray {10 public double Calculate()11 {12 return (Constant.BASE_SALARY + (Constant.BASE_SALARY * 0.1)) * 0.4;13 }14 }15}16  客户端的调用代码:
12using S34namespace AmericanSalary5{6 /**//// <summary&7 /// 客户端程序调用8 /// </summary&Array public class Calculator 10 {11 public static void Main(string[] args) 12 {13 AmericanBonus bonus = new AmericanBonus();14 double bonusValue = bonus.Calculate();15 16 AmericanTax tax = new AmericanTax();17 double taxValue = tax.Calculate();18 1Array double salary = 4000 + bonusValue - taxV 2021 Console.WriteLine("American Salary is:" + salary);22 Console.ReadLine();23 }24 }25}26
  运行程序,输入的结果如下:  American Salary is:2640
  整合成通用系统  让我们回顾一下该系统的发展历程:  最初,我们只考虑将Softo系统运行于中国企业。但随着MaxDO公司业务向海外拓展, MaxDO需要将该系统移植给美国使用。  移植时,MaxDO不得不抛弃中国企业的业务规则类ChineseTax和ChineseBonus, 然后为美国企业新建两个业务规则类: AmericanTax,AmericanBonus。最后修改了业务规则调用Calculator类。  结果我们发现:每当Softo系统移植的时候,就抛弃原来的类。现在,如果中国联想集团要购买该系统,我们不得不再次抛弃AmericanTax,AmericanBonus,修改回原来的业务规则。  一个可以立即想到的做法就是在系统中保留所有业务规则模型,即保留中国和美国企业工资运算规则。
  通过保留中国企业和美国企业的业务规则模型,如果该系统在美国企业和中国企业之间切换时,我们仅仅需要修改Caculator类即可。  让移植工作更简单  前面系统的整合问题在于:当系统在客户在美国和中国企业间切换时仍然需要修改Caculator代码。  一个维护性良好的系统应该遵循“开闭原则”。即:封闭对原来代码的修改,开放对原来代码的扩展(如类的继承,接口的实现)  我们发现不论是中国企业还是美国企业,他们的业务运规则都采用同样的计算接口。 于是很自然地想到建立两个业务接口类Tax,Bonus,然后让AmericanTax、AmericanBonus和ChineseTax、ChineseBonus分别实现这两个接口, 据此修正后的模型如下:
  此时客户端代码如下:
12using S34namespace InterfaceSalary5{6 /**//// <summary&7 /// 客户端程序调用8 /// </summary&Array public class Calculator 10 {11 public static void Main(string[] args) 12 {13 Bonus bonus = new ChineseBonus();14 double bonusValue = bonus.Calculate();15 16 Tax tax = new ChineseTax();17 double taxValue = tax.Calculate();18 1Array double salary = 4000 + bonusValue - taxV 2021 Console.WriteLine("Chinaese Salary is:" + salary);22 Console.ReadLine();23 }24 }25}26  为业务规则增加工厂方法  然而,上面增加的接口几乎没有解决任何问题,因为当系统的客户在美国和中国企业间切换时Caculator代码仍然需要修改。  只不过修改少了两处,但是仍然需要修改ChineseBonus,ChineseTax部分。致命的问题是:我们需要将这个移植工作转包给一个叫Hippo的软件公司。 由于版权问题,我们并未提供Softo系统的源码给Hippo公司,因此Hippo公司根本无法修改Calculator,导致实际上移植工作无法进行。  为此,我们考虑增加一个工具类(命名为Factory),代码如下:
1using S23namespace FactorySalary4{5 /**//// <summary&6 /// Factory类7 /// </summary&8 public class FactoryArray {10 public Tax CreateTax()11 {12 return new ChineseTax();13 }1415 public Bonus CreateBonus()16 {17 return new ChineseBonus();18 }1Array }20}21  修改后的客户端代码:
12using S34namespace FactorySalary5{6 /**//// <summary&7 /// 客户端程序调用8 /// </summary&Array public class Calculator 10 {11 public static void Main(string[] args) 12 {13 Bonus bonus = new Factory().CreateBonus();14 double bonusValue = bonus.Calculate();15 16 Tax tax = new Factory().CreateTax();17 double taxValue = tax.Calculate();18 1Array double salary = 4000 + bonusValue - taxV 2021 Console.WriteLine("Chinaese Salary is:" + salary);22 Console.ReadLine();23 }24 }25}26  不错,我们解决了一个大问题,设想一下:当该系统从中国企业移植到美国企业时,我们现在需要做什么?  答案是: 对于Caculator类我们什么也不用做。我们需要做的是修改Factory类,修改结果如下:
1using S23namespace FactorySalary4{5 /**//// <summary&6 /// Factory类7 /// </summary&8 public class FactoryArray {10 public Tax CreateTax()11 {12 return new AmericanTax();13 }1415 public Bonus CreateBonus()16 {17 return new AmericanBonus();18 }1Array }20}21  为系统增加抽象工厂方法  很显然,前面的解决方案带来了一个副作用:就是系统不但增加了新的类Factory,而且当系统移植时,移植工作仅仅是转移到Factory类上,工作量并没有任何缩减,而且还是要修改系统的源码。 从Factory类在系统移植时修改的内容我们可以看出: 实际上它是专属于美国企业或者中国企业的。名称上应该叫AmericanFactory,ChineseFactory更合适.  解决方案是增加一个抽象工厂类AbstractFactory,增加一个静态方法,该方法根据一个配置文件(App.config或者Web.config) 一个项(比如factoryName)动态地判断应该实例化哪个工厂类,这样,我们就把移植工作转移到了对配置文件的修改。修改后的模型和代码:
  抽象工厂类的代码如下:
1using S2using System.R3 4namespace AbstractFactory5{6 /**//// <summary&7 /// AbstractFactory类8 /// </summary&Array public abstract class AbstractFactory10 {11 public static AbstractFactory GetInstance()12 {13 string factoryName = Constant.STR_FACTORYNAME.ToString();1415 AbstractF1617 if(factoryName == "ChineseFactory")18 instance = new ChineseFactory();1Array else if(factoryName == "AmericanFactory")20 instance = new AmericanFactory();21 else22 instance =232425 }2627 public abstract Tax CreateTax();282Array public abstract Bonus CreateBonus();30 }31}  配置文件:
1<?xml version="1.0" encoding="utf-8" ?&2<configuration&3 <appSettings&4 <add key="factoryName" value="AmericanFactory"&</add&5 </appSettings&6</configuration&7  采用上面的解决方案,当系统在美国企业和中国企业之间切换时,我们需要做什么移植工作?  答案是: 我们仅仅需要修改配置文件,将factoryName的值改为American。  修改配置文件的工作很简单,只要写一篇幅配置文档说明书提供给移植该系统的团队(比如Hippo公司) 就可以方便地切换使该系统运行在美国或中国企业。  最后的修正(不是最终方案)  前面的解决方案几乎很完美,但是还有一点瑕疵,瑕疵虽小,但可能是致命的。    考虑一下,现在日本NEC公司决定购买该系统,NEC公司的工资的运算规则遵守的是日本的法律。如果采用上面的系统构架,这个移植我们要做哪些工作呢?  1. 增加新的业务规则类JapaneseTax,JapaneseBonus分别实现Tax和Bonus接口。   2. 修改AbstractFactory的getInstance方法,增加else if(factoryName.equals("Japanese")){....  注意: 系统中增加业务规则类不是模式所能解决的,无论采用什么设计模式,JapaneseTax,JapaneseBonus总是少不了的。(即增加了新系列产品)  我们真正不能接受的是:我们仍然修要修改系统中原来的类(AbstractFactory)。前面提到过该系统的移植工作,我们可能转包给一个叫Hippo的软件公司。 为了维护版权,未将该系统的源码提供给Hippo公司,那么Hippo公司根本无法修改AbstractFactory,所以系统移植其实无从谈起,或者说系统移植总要开发人员亲自参与。  解决方案是将抽象工厂类中的条件判断语句,用.NET中发射机制代替,修改如下:
1using S2using System.R34namespace AbstractFactory5{6 /**//// <summary&7 /// AbstractFactory类8 /// </summary&Array public abstract class AbstractFactory10 {11 public static AbstractFactory GetInstance()12 {13 string factoryName = Constant.STR_FACTORYNAME.ToString();1415 AbstractF1617 if(factoryName != "")18 instance = (AbstractFactory)Assembly.Load(factoryName).CreateInstance(factoryName);1Array else20 instance =212223 }2425 public abstract Tax CreateTax();2627 public abstract Bonus CreateBonus();28 }2Array}30  这样,在我们编写的代码中就不会出现Chinese,American,Japanese等这样的字眼了。  小结  最后那幅图是最终版的系统模型图。我们发现作为客户端角色的Calculator仅仅依赖抽象类, 它不必去理解中国和美国企业具体的业务规则如何实现,Calculator面对的仅仅是业务规则接口Tax和Bonus。  Softo系统的实际开发的分工可能是一个团队专门做业务规则,另一个团队专门做前端的业务规则组装。 抽象工厂模式有助于这样的团队的分工: 两个团队通讯的约定是业务接口,由抽象工厂作为纽带粘合业务规则和前段调用,大大降低了模块间的耦合性,提高了团队开发效率。  完完全全地理解抽象工厂模式的意义非常重大,可以说对它的理解是你对OOP理解上升到一个新的里程碑的重要标志。 学会了用抽象工厂模式编写框架类,你将理解OOP的精华:面向接口编程。  应对“新对象”  抽象工厂模式主要在于应对“新系列”的需求变化。其缺点在于难于应付“新对象”的需求变动。如果在开发中出现了新对象,该如何去解决呢?这个问题并没有一个好的答案,下面我们看一下李建忠老师的回答:  “GOF《设计模式》中提出过一种解决方法,即给创建对象的操作增加参数,但这种做法并不能令人满意。事实上,对于新系列加新对象,就我所知,目前还没有完美的做法,只有一些演化的思路,这种变化实在是太剧烈了,因为系统对于新的对象是完全陌生的。” 实现要点  ?抽象工厂将产品对象的创建延迟到它的具体工厂的子类。  ?如果没有应对“多系列对象创建”的需求变化,则没有必要使用抽象工厂模式,这时候使用简单的静态工厂完全可以。  ?系列对象指的是这些对象之间有相互依赖、或作用的关系,例如游戏开发场景中的“道路”与“房屋”的依赖,“道路”与“地道”的依赖。  ?抽象工厂模式经常和工厂方法模式共同组合来应对“对象创建”的需求变化。  ?通常在运行时刻创建一个具体工厂类的实例,这一具体工厂的创建具有特定实现的产品对象,为创建不同的产品对象,客户应使用不同的具体工厂。 l 把工厂作为单件,一个应用中一般每个产品系列只需一个具体工厂的实例,因此,工厂通常最好实现为一个单件模式。  ?创建产品,抽象工厂仅声明一个创建产品的接口,真正创建产品是由具体产品类创建的,最通常的一个办法是为每一个产品定义一个工厂方法,一个具体的工厂将为每个产品重定义该工厂方法以指定产品,虽然这样的实现很简单,但它确要求每个产品系列都要有一个新的具体工厂子类,即使这些产品系列的差别很小。 优点  ?分离了具体的类。抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。  ?它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次??即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。  ?它有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。  缺点  ?难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂几口确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。  适用性  在以下情况下应当考虑使用抽象工厂模式:  ?一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。   ?这个系统有多于一个的产品族,而系统只消费其中某一产品族。   ?同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。   ?系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。  应用场景  ?支持多种观感标准的用户界面工具箱(Kit)。  ?游戏开发中的多风格系列场景,比如道路,房屋,管道等。  ?……  总结  总之,抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,运用抽象工厂模式的关键点在于应对“多系列对象创建”的需求变化。一句话,学会了抽象工厂模式,你将理解OOP的精华:面向接口编程。
以上内容由
搜集整理,如转载请注明原文出处,并保留这一部分内容。
  “华夏名网”
是成都飞数科技有限公司的网络服务品牌,专业经营虚拟主机,域名注册,VPS,服务器租用业务。公司创建于2002年,经过6年的高速发展,“华夏名网”已经成为我国一家知名的互联网服务提供商,被国外权威机构评价为十大IDC服务商之一。
华夏名网网址导航:
上一篇:下一篇:
(4915次点击) (2767次点击) (4157次点击) (2792次点击) (2366次点击) (3724次点击) (3565次点击) (2358次点击) (2528次点击) (2437次点击)
(3413次点击) (3231次点击) (3242次点击) (3988次点击) (2404次点击) (2318次点击) (3208次点击) (3615次点击) (2348次点击) (2332次点击)
&2002- 飞数科技 版权所有
电话总机:028-91 94
公司地址:四川省成都市青龙街51号倍特康派大厦10楼5号}

我要回帖

更多关于 抽象工厂模式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信