工厂方法模式

简单定义###

定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

工厂方法(Factory Method)模式的意义###

是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

核心精神###

是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。

工厂方法模式的类图###

0_1331817716F3IJ.gif.jpg

工厂方法模式有四个要素###

工厂接口:工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。

工厂实现:在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的工厂实现。

产品接口:产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用抽象类来代替,但要注意最好不要违反里氏替换原则。

产品实现:实现产品接口的具体类,决定了产品在客户端中的具体行为。

比如,造汽车 如果不用工厂方法

    class Engine {  
        public void getStyle(){  
            System.out.println("这是汽车的发动机");  
        }  
    }  
    class Underpan {  
        public void getStyle(){  
            System.out.println("这是汽车的底盘");  
        }  
    }  
    class Wheel {  
        public void getStyle(){  
            System.out.println("这是汽车的轮胎");  
        }  
    }  
    public class Client {  
        public static void main(String[] args) {  
            Engine engine = new Engine();  
            Underpan underpan = new Underpan();  
            Wheel wheel = new Wheel();  
            ICar car = new Car(underpan, wheel, engine);  
            car.show();  
        }  
    }  

调用者为了组装汽车还需要另外实例化发动机、底盘和轮胎,而这些汽车的组件是与调用者无关的,严重违反了###迪米特法则(上一篇文章说过)###,耦合度太高。并且非常不利于扩展。

使用工厂方法后

    interface IFactory {  
        public ICar createCar();  
    }  
    class Factory implements IFactory {  
        public ICar createCar() {  
            Engine engine = new Engine();  
            Underpan underpan = new Underpan();  
            Wheel wheel = new Wheel();  
            ICar car = new Car(underpan, wheel, engine);  
            return car;  
        }  
    }  
    public class Client {  
        public static void main(String[] args) {  
            IFactory factory = new Factory();  
            ICar car = factory.createCar();  
            car.show();  
        }  
    }  

相关应用###

许多web主流框架的DAO层 jdbc等等

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大史住在大前端

javascript基础修炼(8)——指向FP世界的箭头函数

箭头函数是ES6语法中加入的新特性,而它也是许多开发者对ES6仅有的了解,每当面试里被问到关于“ES6里添加了哪些新特性?”这种问题的时候,几乎总是会拿箭头函数...

1083
来自专栏Albert陈凯

Scala兴衰史:暂时的没落或许是一个新的开始

5年前,Scala 似乎曾要成为编程语言中下一个佼佼者,因为它能够优雅得使用面向对象编程范式进行函数编程。 现如今,随着像 LinkedIn 和 Yammer ...

3834
来自专栏wym

HDU 1166 敌兵布阵

http://acm.hdu.edu.cn/showproblem.php?pid=1166

982
来自专栏一个会写诗的程序员的博客

编程范式 (Programming paradigm)

范,模范、典范也。范式即模式、方法。常见的编程范式有:函数式编程、程序编程、面向对象编程、指令式编程等。

3531
来自专栏Aloys的开发之路

关于强制式(命令式)语言和声明式语言的区别

在阅读Alfred V.Aho等的大作Compilers Principles,Techniques and Tools是看到如下一段话: Another  c...

2895
来自专栏Coding01

浅谈 Laravel Collections

这两天看了两本书《Laravel Collections Unraveled》和 《Refactoring to Collections》。

3492
来自专栏IT笔记

聊聊JAVA中 String类为什么不可变

前言 "我的风格比较偏传统和经典" 小明说,"我们在打扮自己的问题上还是蛮冒险的...我觉得当你是只狗的时候,穿什么都hold的住!" ? 哈哈哈,脱离单身狗快...

42219
来自专栏java一日一条

为什么要使用String

这段代码总的来说是OK的。该方法将map中每个Dwarable的key和值,以及和它期望被分解的dwarwleKey一同传得给另一个调用方法。因为功能简单,我就...

523
来自专栏平凡文摘

国外大神总结的 10 个 Java 编程技巧!

1262
来自专栏好好学java的技术栈

小海聊数据结构系列之早操排队图解冒泡排序

一直想写一些简单易懂的文章,因为平时看的很多的书籍或者文章都是看着很难受的感觉,当然,这并不是说书籍写的不好,只是说对于一些没有太多基础或者基础不是很好的来说,...

1183

扫码关注云+社区

领取腾讯云代金券