博客
关于我
设计模式【2.1】-- 简单工厂模式怎么演变成工厂方法模式?
阅读量:398 次
发布时间:2019-03-05

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

还记得前面的简单工厂模式么?我们开了一个水果工厂FruitFactory,生产三种水果ApplePearOrange。今天给大家讲讲工厂方法模式:

老板搞水果工厂赚了点小钱,准备扩大生产,每个工厂生产一种水果,各司其职,而不是把所有的产品类型都放到一个工厂中。

既然有多工厂,那我们和之前一样,搞一个水果工厂类FruitFactory,把它搞成接口类。

import factory.Fruit;public interface FruitFactory {    public Fruit getFruit();}

水果类的定义还是一样,定义一个水果接口Fruit:

public interface Fruit {    public void process();}

水果分别如下,我直接写到一块去了:

public class Apple implements Fruit {    public void process() {        System.out.println("I am an Apple");    }}public class Pear implements Fruit {    public void process() {        System.out.println("I am a Pear");    }}public class Orange implements Fruit {    public void process() {        System.out.println("I am an Orange");    }}

既然有多个工厂。那我们分别定义多个工厂,对水果工厂类做不同的实现,分别生产苹果,雪梨,橙子。

public class AppleFactory implements FruitFactory {    public Fruit getFruit(){        return new Apple();    }}public class PearFactory implements FruitFactory {    public Fruit getFruit(){        return new Pear();    }}public class OrangeFactory implements FruitFactory {    public Fruit getFruit(){        return new Orange();    }}

测试代码如下:

public class FruitTest {    public static void main(String[] args) {        FruitFactory appleFactory = new AppleFactory();        Fruit apple = appleFactory.getFruit();        apple.process();        FruitFactory pearFactory = new PearFactory();        Fruit pear = pearFactory.getFruit();        pear.process();    }}

运行结果:

I am an AppleI am an Pear

上面的写法,如果后续还有生产不同的水果,或者不同的水果工厂,相对容易拓展。总结一下,工厂方法模式一共有以下的角色:

  • 抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 getFruit() 来创建水果产品。
  • 具体工厂:主要是实现抽象工厂中的抽象方法,创建具体的产品。
  • 抽象产品:定义了产品规范,比如所有的水果共同的特性。
  • 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

那么工厂方法模式,相对简单工厂模式,有什么区别呢?

工厂方法模式,一种工厂对应一种产品,各司其职,如果产品很多的话,方便分开维护,特别是那种创建产品比较复杂的场景,而产品类型又比较多,这样就会显得很臃肿。

但是如果产品很少,而且创建过程相对简单的时候,感觉简单工厂模式已经足够,不需要特意为了使用一种设计模式而使用它,过度设计会带了很多不必要的麻烦。

【作者简介】

秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。

转载地址:http://mdmzz.baihongyu.com/

你可能感兴趣的文章
MySQL I 有福啦,窗口函数大大提高了取数的效率!
查看>>
mysql id自动增长 初始值 Mysql重置auto_increment初始值
查看>>
MySQL in 太多过慢的 3 种解决方案
查看>>
Mysql Innodb 锁机制
查看>>
MySQL InnoDB中意向锁的作用及原理探
查看>>
MySQL InnoDB事务隔离级别与锁机制深入解析
查看>>
Mysql InnoDB存储引擎 —— 数据页
查看>>
Mysql InnoDB存储引擎中的checkpoint技术
查看>>
Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
查看>>
MySQL InnoDB引擎的锁机制详解
查看>>
Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
查看>>
mysql InnoDB数据存储引擎 的B+树索引原理
查看>>
mysql innodb通过使用mvcc来实现可重复读
查看>>
mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
查看>>
Mysql join原理
查看>>
mysql order by多个字段排序
查看>>
MySQL Order By实现原理分析和Filesort优化
查看>>
mysql problems
查看>>
mysql replace first,MySQL中处理各种重复的一些方法
查看>>
MySQL replace函数替换字符串语句的用法(mysql字符串替换)
查看>>