23种设计模式[2]:工厂方法模式

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

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

类型:创建类模式

public interface SmsService {
    void sendSms();
}

public class MontnetsService 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 MontnetsService();
                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 MontnetsService 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 MontnetsService();
                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

原文地址:https://www.cnblogs.com/phpdragon/p/8298188.html

时间: 2024-10-21 01:07:47

23种设计模式[2]:工厂方法模式的相关文章

23种设计模式(1) - 工厂方法模式

1.定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 2.举例 有一个Animal接口,有两个类Dog和Cat分别继承了该接口.我们通过一个叫AnimalDactory的工厂类接口,再定义DogFactory和CatFactory类来分别创建Dog和Cat实例,由调用端来决定使用哪个工厂来创建对象. 3.代码 // 创建 动物 接口 public interface Animal { void sayName(); } // 创建 猫和狗 类 p

23种设计模式之工厂方法模式

工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. package designMode.factoryMethod; interface IProduct { void function1(); void function2(); void function3(); } package designMode.factoryMethod; class Product1 implements IProduct{

java23种设计模式之八: 工厂方法模式

定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的“创建与使用相分离”的特点. 我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”.如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”, 它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背“开闭原则”. 优点: 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程: 在系统增加新的产品时只需要添加具体产品类和

java设计模式:工厂方法模式(Factory Method)

工厂方法模式 返回设计模式目录 阅读目录: 简单工厂模式 介绍 UML类图 参考代码 总结 工厂方法模式 介绍 UML类图 参考代码 总结 前言: <大话设计模式>里有一小节叫'活字印刷,面向对象'的,讲了一个小故事,大意如下: 话说三国时期,曹操带领大军驻扎于赤壁.军船相连,气势恢宏,眼看要灭掉东吴,统一天下,曹操甚悦,于是大宴群臣.席间曹操诗兴大发,不觉吟道:"喝酒唱歌,人生真爽.--".众文武齐呼:"丞相好诗!".于是一臣子速命印刷工匠刻板印刷,以

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

设计模式之工厂方法模式

anticipate 预料 = except ant蚂蚁 ic ic卡 ip ip卡 ate吃 我没有预料到小蚂蚁把我的ic,ip卡吃掉了. robust 强壮的 = strong ro rong容祖儿  bu不  st石头 容祖儿不喜欢强壮的石头. maintain 维持 = keep main主要的(大陆)  tain 台湾 大陆和台湾维持着若即若离的关系. 设计模式之工厂方法模式 动机:     一个工厂方法factory method定义了一个接口来创建对象,但是让子类去选择创建哪一个,

Java经典23种设计模式之结构型模式(二)

接上篇,本文介绍结构型模式里的组合模式.装饰模式.外观模式. 一.组合模式(Composite) 组合模式:将对象组合成树形结构,表示"部分--整体"的层次结构.最终达到单个对象和组合对象的使用具有一致性.单看这句话貌似有点抽象,其实比较简单. 以李云龙的独立团为例,目的要统计赵嘉宇一战共歼灭敌人多少个.最高的级别是团,一个团有若干个营,一个营有若干个排,一个排有若干个战士.(为了简化问题,排下面就不设行政单位了).很自然的,李云龙给营长开会回去给老子统计.营长回去给各个排长开会,赶紧

每天一个设计模式-5 工厂方法模式

每天一个设计模式-5 工厂方法模式 1.模式定义 定义一个用于创建对象的接口,让子类决定实例化那一个类,Factory Method使一个类的实例化延迟到其子类. 2.工厂方法模式解决问题的思路 工厂方法模式需要接口对象,那就定义一个方法来创建这个接口对象(工厂方法):可是事实上它自己是不知道如何创建这个接口对象的,没有关系,定义成抽象方法让子类来实现就可以了:这样这个对象本身就可以只是面向接口编程,而无需关心到底如何创建接口对象了. 3.实际问题 实现一个导出数据的功能,客户选择数据的导出格式

C#设计模式(3)——工厂方法模式

一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary> /// 菜抽象类 /// </summary> public abstract class Food { // 输出点了什么菜 public abstract void Print(); } /// <summary> /// 西红柿炒鸡蛋这道菜 /// </summary

Java经典23种设计模式之结构型模式(一)

结构型模式包括7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式其实很简单,就像手机充电器一样,手机需要5V的,而插座出来是220V.因此需要充电器变压就ok.再比如,一个之会说汉语的和一个只会说英语的无法沟通,那就中间请个翻译.所有的交流通过翻译,翻译翻给会说英语的,就能完成一次单项交流的.链接1 中的例子非常生动形象了.总结一下,无非就是有个通用的接口(称为Target),如果一切顺