文档章节

炒冷饭系列:设计模式 工厂模式

泥瓦匠BYSocket
 泥瓦匠BYSocket
发布于 2014/07/19 21:50
字数 1087
阅读 228
收藏 18

炒冷饭系列:设计模式 工厂模式

摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢!

事虽险,吾善为;苟擅为,子道亏。物虽小,勿私藏;苟私藏,亲心伤。

一、什么是简单工厂模式

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建 其他类的实例,被创建的实例通常都具有共同的父类。

二、模式中包含的角色及其职责

1.工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

2.抽象(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

3.具体产品(Concrete Product)角色
简单工厂模式所创建的具体实例对象

注意:1.在工厂类中,实现逻辑。最好不能再子类或者父类中实现代码逻辑。2.对象子类继承父类的接口。

下面我们来个一个关于工厂类的最简单的例子:
先给出一个接口父类 Fruit.java,并且赋予采集方法

复制代码

public interface Fruit
{    /*
     * 采集     */
    public void get();
}

复制代码

随后,有两个实体类 Apple.java 和 Banana.java

复制代码

public class Apple implements Fruit
{    /*
     * 采集     */
    public void get()
    {
        System.out.println("采集Apples");
    }
}public class Apple implements Fruit
{    /*
     * 采集     */
    public void get()
    {
        System.out.println("采集Apples");
    }
}

复制代码

这样,我们仿佛有了原材料,简单工厂模式,就像工厂产出商家所需要的东西。

    image

三.简单工厂类FruitFactory.java的升级之路

粗劣的版本如下:

复制代码

public class FruitFactory
{    /**
     * 获得Apple类实例     */
    public static Fruit getApple()
    {        return new Apple();
    }    
    /**
     * 获得Banana类实例     */
    public static Fruit getBanana()
    {        return new Banana();
    }

}

复制代码

升级下:

复制代码

public class FruitFactory
{/**
     * get方法,获得所有产品对象
     * @throws IllegalAccessException 
     * @throws InstantiationException 
     */
    public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException
    {        if (type.equalsIgnoreCase("apple"))
        {            return Apple.class.newInstance();
        }else if (type.equalsIgnoreCase("apple"))
        {            return Banana.class.newInstance();
        }else
            return null;
    }
}

复制代码

在思考,究极版:

复制代码

public class FruitFactory
{    /**
     * get方法,获得所有产品对象
     * @throws IllegalAccessException 
     * @throws InstantiationException 
     * @throws ClassNotFoundException 
     */
    public static Fruit getFruit(String type) throws ClassNotFoundException, InstantiationException, IllegalAccessException
    {
        Class<?> fruit = Class.forName(type);        return (Fruit)fruit.newInstance();
    }
}

复制代码

测试下,我们的工厂:

复制代码

public class MainClass
{    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException
    {
        Fruit apple = FruitFactory.getFruit(Apple.class.getName());
        Fruit banana = FruitFactory.getFruit(Banana.class.getName());
        
        apple.get();
        banana.get();
    }
}

复制代码

你可以看到打印出:

采集Apples
采集Banana

 

相关资料:

java.lang.Class<T>

static Class<?> forName(String className)
          返回与带有给定字符串名的类或接口相关联的 Class 对象。

public T newInstance()

          Creates a new instance of the class represented by this {@code Class}

public final Class<?> getClass()
  • 返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。

  •  

四 简单工厂模式的优缺点

在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断 逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的 对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无 需了解这些对象是如何创建以及如何组织的。有利于整个软件体系 结构的优化。不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中 了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的 具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展 性并不很好。

五 感谢知识来源和小结

一、什么是简单工厂模式

二、模式中包含的角色及其职责

三.简单工厂类FruitFactory.java的升级之路

四.简单工厂模式的优缺点

来自:java设计模式

如以上文章或链接对你有帮助的话,别忘了在文章按钮或到页面右下角点击 “赞一个” 按钮哦。你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

亲所好,力为具;亲所恶,谨为去。身有伤,贻亲忧;德有伤,贻亲羞。


© 著作权归作者所有

泥瓦匠BYSocket

泥瓦匠BYSocket

粉丝 935
博文 163
码字总数 214042
作品 4
杭州
程序员
私信 提问
加载中

评论(2)

泥瓦匠BYSocket
泥瓦匠BYSocket 博主

引用来自“shanyejunjie”的评论

很好,一直没搞懂何谓工厂。
表面意思懂就懂了
shanyejunjie
shanyejunjie
很好,一直没搞懂何谓工厂。
炒冷饭系列:设计模式 抽象工厂模式

炒冷饭系列:设计模式 抽象工厂模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是抽象工厂模...

泥沙砖瓦浆木匠
2014/07/24
0
0
炒冷饭系列:设计模式 单例模式

炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是单例模式 单例模...

泥沙砖瓦浆木匠
2014/07/28
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0
炒冷饭系列:设计模式 工厂方法模式

炒冷饭系列:设计模式 工厂方法模式 摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 事虽险,吾善为;苟擅为,子道亏。物虽小,勿私藏;...

泥沙砖瓦浆木匠
2014/07/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux 软链接和硬链接简介

本文主要介绍了Linux系统中的链接文件。 文件系统 在Linux系统中,将文件分为两个部分:用户数据和元数据。 元数据(inode) 元数据即文件的索引节点(inode),用来记录文件的权限(r、w、x...

问题终结者
37分钟前
1
0
RocketMQ的事务投递

RocketMQ的事务投递 这是阿里的分布式事务图: 1、A服务先发送个Half Message给Brock端,消息中携带 B服务 即将要+100元的信息。 2、当A服务知道Half Message发送成功后,那么开始第3步执行本...

春哥大魔王的博客
52分钟前
2
0
Qt编写自定义控件31-面板仪表盘控件

一、前言 在Qt自定义控件中,仪表盘控件是数量最多的,写仪表盘都写到快要吐血,可能是因为各种工业控制领域用的比较多吧,而且仪表盘又是比较生动直观的,这次看到百度的echart中有这个控件...

飞扬青云
57分钟前
5
0
DisplayPort 迎来重大更新,数据带宽性能提高3倍

VESA宣布了他们对DisplayPort接口三年来的第一次重大更新。 与DP 1.4a相比,DisplayPort 2.0提供了三倍于DP 1.4a的数据带宽性能,支持超过8K的分辨率,更高的刷新率和更高分辨率的HDR,以及其...

linuxCool
今天
2
0
《Linux就该这么学》2019年7月20日第八天上课笔记

du命令 du -sh /newFS/ 察看文件/文件夹数据占用量 SWAP 交换分区的设置 磁盘容量配额 RHEL 5/6 usrquota RHEL 7 quota 软硬连接 ln 软 指针指向inode 硬 建立新的inode RAID 0 1 5 1+0...

2lodoss
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部