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

1、定义

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

2、举例

有一个Animal接口,有两个类DogCat分别继承了该接口。我们通过一个叫AnimalDactory的工厂类接口,再定义DogFactoryCatFactory类来分别创建DogCat实例,由调用端来决定使用哪个工厂来创建对象。

3、代码

// 创建 动物 接口
public interface Animal {
    void sayName();
}

// 创建 猫和狗 类
public class Cat implements Animal {
    @Override
    public void sayName() {
        System.out.println("我是猫!");
    }
}
public class Dog implements Animal {
    @Override
    public void sayName() {
        System.out.println("我是狗!");
    }
}

// 创建工厂接口类
public interface IAnimalFactory {
    Animal createAnimal();
}
// 分别创建生成猫和狗 的工厂类
public class CatFactory implements IAnimalFactory{
    @Override
    public Animal createAnimal() {
        return new Cat();
    }
}
public class DogFactory implements IAnimalFactory{
    @Override
    public Animal createAnimal() {
        return new Dog();
    }
}

// 客户端使用工厂类来创建动物对象
public class Main {
    public static void main(String[] args) {
        // 分别获得生产猫和狗的工厂类
        IAnimalFactory catFacroty = new CatFactory();
        IAnimalFactory dogFacroty = new DogFactory();

        Animal cat = catFacroty.createAnimal();
        Animal dog = dogFacroty.createAnimal();

        cat.sayName();
        dog.sayName();
    }
}

下面是运行的结果:

我是猫!
我是狗!

4、优点

工厂模式分为 简单工厂模式工厂方法模式简单方法模式中的工厂方法一般是静态的,不会有接口,而且一个工厂可以创建多个实例,代码如下:

// 简单工厂模式的工厂
public class AnimalFactory implements IAnimalFactory{
    @Override
    public Animal createAnimal(String name) {
        // 通过 if 判断,生成多中不同的实例
        if("cat".equals(name)){
            return new Cat();
        }
        if("dog".equals(name)){
            return new Dog();
        }
        throw new RuntimeException("无此类动物:" + name);
    }
}

而在工厂方法模式中,会有工厂接口,而且针对不同的实例,会有多个工厂类。

大家看到这里会发现,简单工厂模式比起工厂方法模式来说,简洁的多(因为没有多个工厂类)。但是,在简单工厂模式中,工厂类包含了判断逻辑,如果我们要添加一个新的Animal类,需要修改原来工厂类的方法,这样我们不但对拓展开放了,对修改也开放了,违背了 开放-封闭原则。而如果使用工厂方法模式,我们只需要增加一个新的工厂就能实现功能拓展,而不要去修改原来的代码。

从根本上说,这两种模式都存在判断的问题。简单工厂模式是把判断逻辑放到了工厂的方法中,工厂方法模式则把判断逻辑放在调用端,由调用端来判断该使用哪个工厂类,这样想要加新功能时,只需要修改调用端就行,而不是工厂类。

5、适用场景

  • 工厂模式屏蔽了创建类的内部细节,降低了调用类之间的耦合度。
  • 如果一个类的创建流程比较复杂,使用工厂类可以有效的降低系统复杂度。
  • 工厂模式依靠抽象架构,具有较好的拓展性。

原文地址:https://www.cnblogs.com/moongeek/p/12543690.html

时间: 2024-08-04 17:50:44

23种设计模式(1) - 工厂方法模式的相关文章

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),如果一切顺