博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
23种设计模式[2]:工厂方法模式
阅读量:6700 次
发布时间:2019-06-25

本文共 2678 字,大约阅读时间需要 8 分钟。

一、简单工厂模式(静态工厂方法,不属于23种GOF设计模式之一)

定义:定义一个用于创建产品对象的方法,由该工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

类型:创建类模式

public interface SmsService {    void sendSms();}public class MontnetsSmsService implements SmsService {    @Override    public void sendSms() {        System.out.println("通过梦网发送!");    }}public class EtonenetSmsService implements SmsService {    @Override    public void sendSms() {        System.out.println("通过移通发送!");    }}public class SmsServiceFactory {    public static SmsService getSmsService(int providerId) {        SmsService ss;        switch (providerId) {            case 0:                ss = new MontnetsSmsService();                break;            case 1:                ss = new EtonenetSmsService();                break;            default:                ss = new EtonenetSmsService();        }        return ss;    }    public static void main(String[] args) {        SmsService ss = SmsServiceFactory.getSmsService(0);        //发送短信        ss.sendSms();    }}

 

 

二、工厂方法模式

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

类型:创建类模式

类图:

工厂方法模式代码:

public interface SmsService {    void sendSms();}//工厂接口public interface SmsServiceFactory {    SmsService getSmsService(int providerId);}public class MontnetsSmsService implements SmsService {    @Override    public void sendSms() {        System.out.println("通过梦网发送!");    }}public class EtonenetSmsService implements SmsService {    @Override    public void sendSms() {        System.out.println("通过移通发送!");    }}/** * 工厂实现类 */public class SmsServiceFactoryImpl implements SmsServiceFactory{    @Override    public SmsService getSmsService(int providerId) {        SmsService ss;        switch (providerId) {            case 0:                ss = new MontnetsSmsService();                break;            case 1:                ss = new EtonenetSmsService();                break;            default:                ss = new EtonenetSmsService();        }        return ss;    }    public static void main(String[] args) {     //向上转型为工程接口        SmsServiceFactory ssf = new SmsServiceFactoryImpl();        SmsService ss = ssf.getSmsService(0);        //发送短信        ss.sendSms();    }}

工厂方法模式:

  通过工厂方法模式的类图可以看到,工厂方法模式有四个要素:

  • 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。
  • 工厂实现。在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的工厂实现。
  • 产品接口。产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用抽象类来代替,但要注意最好不要违反里氏替换原则。
  • 产品实现。实现产品接口的具体类,决定了产品在客户端中的具体行为。

  上文提到的简单工厂模式跟工厂方法模式极为相似,区别是:简单工厂只有三个要素,他没有工厂接口,并且得到产品的方法一般是静态的(红色注释部分)。因为没有工厂接口,所以在工厂实现的扩展性方面稍弱,可以算所工厂方法模式的简化版。

 

 

如写的不好,欢迎拍砖!

PS:

http://blog.csdn.net/zhengzhb/article/details/7359385

 

你可能感兴趣的文章
Scala.js:将Scala编译为JavaScript的编译器
查看>>
Cling旨在提供一款高性能的C++ REPL
查看>>
DevOps团队结构类型汇总:总有一款适合你
查看>>
理解浏览器是如何加载及渲染网页的
查看>>
Vue2.0王者荣耀助手
查看>>
\"Grokking Algorithms\"简介与作者采访
查看>>
停止过度设计,开发客户需要的软件
查看>>
用WinForm/WPF代码来为.NET Core 3.0功能投票
查看>>
边缘控制平面Ambassador全解读
查看>>
F#创建者Don Syme谈F#设计原则
查看>>
微软正在考虑将Windows默认浏览器改为Chromium
查看>>
从蚂蚁金服实践入手,带你深入了解 Service Mesh
查看>>
京东购物在微信等场景下的算法应用实践
查看>>
MongoDB Mobile Sync for iOS推出Beta版本
查看>>
VS Code 0.5添加ES6支持和Git工具改进
查看>>
F# 4.0于全平台发布
查看>>
回顾小程序2018年三足鼎立历程,2019年BAT火力全开
查看>>
分布式系统的开发经验与心得
查看>>
Apple着手抛弃32位macOS应用程序
查看>>
StringBuffer与StringBuilder
查看>>