2.1.2 工厂方法模式(3.3)

来源:互联网 发布:八仙饭店知乎 编辑:程序博客网 时间:2024/06/05 09:27

工厂方法模式(factory method pattern)从2方面认识。

编程技巧:这是对参数化工厂方法加以改进的经典技术,以多态来重构if-else、switch-case等分支结构。

设计思路:你一定要注意,工厂方法模式中Client关注的不是的产品(所以静态工厂中Door的例子,不适合),Client关注的是工厂

1.以多态来重构分支结构

静态工厂的缺点是分支结构,需要增添新的分支时,程序不符合OCP。
package creational.factory;public class DoorFactory{    public static Door getObject(String typeName){//int ID        if(typeName.equals("D1")){            return new D1();        }else if(typeName.equals("D2")){            return new D2();        }else{            return null;        }    }}package creational.factory;public class Hand{    static Door d = null;        public static void test(){        d = DoorFactory.getObject("D2");        d.m();    }}
不使用配置文件和反射机制的情况下,

interface IDoorFactory {public Door createDoor();}class D1Factory implements IDoorFactory {public D1 createDoor() {return new D1();}}//D2Factory 略public class Client {public static void main(String[] args) {IDoorFactory factory = new D1Factory();Door door= factory.createDoor();//生产D1door.m();}}
将工厂类泛化成抽象类型,以其子类多态地创建不同的产品如Door的子类。
它体现了一种非常重要的思考方式——以多态来重构if-else或switch-case结构。从重构分支结构的角度看,策略模式与[2.1.3工厂方法模式(3.3)]和[4.2状态模式(5.8)]是三胞胎。

2.颠倒黑白

上面例子中Hand采用工厂方法模式并不令人信服。Hand避免了依赖Door的具体子类D1、D2等,却变成了依赖具体的D1Factory、D2 Factory。通过依赖注入,可以使得Hand仅仅依赖Factory,但是,这样做不如直接通过依赖注入让Hand依赖抽象类型Door。

编程实践中,通常工厂是Client关注的主体,而工厂生产的产品被Client所忽视。例如Client开车ICar,不管什么车Client都可以开。现在,Car要找它的4S店/I4S,Client会关注各种4S店吗?


interface ICar{ //工厂接口public I4S get4S();//管你是那个4S店public void move();}class BBCar implements ICar{    public I4S get4S() {        return new BB4S();    }    public void move(){        System.out.println("BBCar move");    }}//QQCar 略interface I4S{        void doShomthing();}//实现类略public class Client{    public static void main(String[] args) {ICar car =(ICar)tool.God.create("2-6-Car"); //ICar car =new BBCar();car.move();I4S repair = car.get4S();repair.doShomthing();car.move();}}

由于受通用工具类如God——反射+配置的压制,现在应用程序中使用工厂方法模式比较少见。
不使用配置文件的场合,如JDK的设计中广泛使用,典型例子:

public interface Iterable{

    Iterator iterator();//返回一个迭代器

}



1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 捡的小米6被锁了怎么办 小米5s手机玩穿越火线卡怎么办 苹果平板更新完系统登录不上怎么办 谷歌商店一直卡在核对信息怎么办 贴吧邮箱忘了无法登陆怎么办 华为手机绑定了账号忘了怎么办 淘宝的手机多次注册无法登录怎么办 电脑看不到U盘里面的文件怎么办 c盘访问权限被锁了怎么办 xp系统电脑开机密码忘记了怎么办 华为荣耀9用久了卡怎么办 华为p9相机模糊敲打就正常怎么办 华为p9蓝频按什么都没反映怎么办 华为手机p9开机密码忘了怎么办 华为P9手机开机一直闪屏怎么办 荣耀畅玩7x用户数据锁定怎么办 华为手机p9的指纹解锁坏了怎么办 华为P9青春版外放音量小怎么办 华为麦芒5的开关键失灵怎么办 小米手机进水黑屏但是有声音怎么办 小米5手机突然黑屏没电怎么办 小米4开不了机怎么办充电没反应 小米手机充电没反应开不了机怎么办 红米note手机开不了机怎么办 红米手机突然黑屏开不了机怎么办 红米2a开不开机怎么办 红米4手开不了机怎么办 红米4a开不了机怎么办 魅族手机拨打电话时黑屏怎么办 金立手机拨打电话时黑屏怎么办 红米手机刷机黑屏了怎么办 酷派手机开机黑屏但能嗡嗡响怎么办 酷派手机忘记锁屏密码怎么办 酷派手机锁屏密码忘了怎么办 酷派手机不停的开机关机怎么办 苹果6手机进水了开不了机怎么办 金立手机突然黑屏开不了机怎么办 丢失手机又忘了ID锁怎么办? 小米2按出电话后黑屏怎么办 华为手机桌面拨号键没有了怎么办 华为荣耀5x黑屏后无法关机怎么办