Android开发之设计模式-工厂模式

工厂模式(Factory Pattern)

属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

主要解决:主要解决接口选择的问题。

何时使用:我们明确地计划不同条件下创建不同实例时。

如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

关键代码:创建过程在其子类执行。

应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。

优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

使用场景: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,”POP3″、”IMAP”、”HTTP”,可以把这三个作为产品类,共同实现一个接口。

注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

这里引用设计模式之禅中的例子,讲的是女娲造人,归结成工厂模式。我觉得蛮有意思的

《Android开发之设计模式-工厂模式》

 1、定义一个人类的总称:

public interface Human {
//首先定义什么是人类

 //人是愉快的,会笑的,本来是想用smile表示,想了一下laugh更合适,好长时间没有大笑了;
public void laugh();

//人类还会哭,代表痛苦
public void cry();

//人类会说话
public void talk();

} 

 2、定义具体的人类

public class YellowHuman implements Human {

public void cry() {
 System.out.println("黄色人类会哭");
 }
public void laugh() {
 System.out.println("黄色人类会大笑,幸福呀!");
 }
public void talk() {
 System.out.println("黄色人类会说话,一般说的都是双字节"); 
 }
}

 

public class WhiteHuman implements Human {
public void cry() {
 System.out.println("白色人类会哭");
 }
public void laugh() {
 System.out.println("白色人类会大笑,侵略的笑声");
 }
public void talk() {
 System.out.println("白色人类会说话,一般都是但是单字节!");
 }
} 

 

public class BlackHuman implements Human {
public void cry() {
 System.out.println("黑人会哭"); 
}
public void laugh() {
 System.out.println("黑人会笑");
 }
public void talk() {
 System.out.println("黑人可以说话,一般人听不懂");
 }
} 

 人类也定义完毕了,那我们把八卦炉定义出来:

/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 今天讲女娲造人的故事,这个故事梗概是这样的:
* 很久很久以前,盘古开辟了天地,用身躯造出日月星辰、山川草木,天地一片繁华
* One day,女娲下界走了一遭,哎!太寂寞,太孤独了,没个会笑的、会哭的、会说话的东东
* 那怎么办呢?不用愁,女娲,神仙呀,造出来呀,然后捏泥巴,放八卦炉(后来这个成了太白金星的宝
贝)中烤,于是就有了人:
* 我们把这个生产人的过程用Java程序表现出来:
*/
public class HumanFactory { 
   //定一个烤箱,泥巴塞进去,人就出来,这个太先进了
public static Human createHuman(Class c){
 Human human=null; //定义一个类型的人类

 try {
 human = (Human)Class.forName(c.getName()).newInstance(); //产生一个
人类

 } catch (InstantiationException e) {//你要是不说个人类颜色的话,没法烤,要白的
黑,你说话了才好烤

 System.out.println("必须指定人类的颜色");
 } catch (IllegalAccessException e) { //定义的人类有问题,那就烤不出来了,这是...
 System.out.println("人类定义错误!");
 } catch (ClassNotFoundException e) { //你随便说个人类,我到哪里给你制造去?!

 System.out.println("混蛋,你指定的人类找不到!");
 }
 return human;
 }

}

 然后我们再把女娲声明出来:

public class NvWa {
    public static void main(String[] args) {
        //女娲第一次造人,试验性质,少造点,火候不足,缺陷产品
        System.out.println("------------造出的第一批人是这样的:白人-----------------");
        Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
        whiteHuman.cry();
        whiteHuman.laugh();
        whiteHuman.talk();

        //女娲第二次造人,火候加足点,然后又出了个次品,黑人
        System.out.println("\n\n------------造出的第二批人是这样的:黑人-----------------");
        Human blackHuman = HumanFactory.createHuman(BlackHuman.class);
        blackHuman.cry();
        blackHuman.laugh();
        blackHuman.talk();

        //第三批人了,这次火候掌握的正好,黄色人类(不写黄人,免得引起歧义),备注:RB人不属于此列
        System.out.println("\n\n------------造出的第三批人是这样的:黄色人类-----------------");
        Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);
        yellowHuman.cry();
        yellowHuman.laugh();
        yellowHuman.talk();
    }
}

运行结果如下:

————造出的第一批人是这样的:白人—————–
白色人类会哭
白色人类会大笑,侵略的笑声
白色人类会说话,一般都是但是单字节!

————造出的第二批人是这样的:黑人—————–
黑人会哭
黑人会笑
黑人可以说话,一般人听不懂

————造出的第三批人是这样的:黄色人类—————–
黄色人类会哭
黄色人类会大笑,幸福呀!
黄色人类会说话,一般说的都是双字节

简单工厂模式详解链接:

https://wenku.baidu.com/view/e5aaab0f79563c1ec5da7113.html?st=1

工厂模式详解链接:

https://wenku.baidu.com/view/b1c9875fbe23482fb4da4c13.html?st=1

下篇介绍抽象工厂模式,待续…

    原文作者:yun382657988
    原文地址: https://blog.csdn.net/yun382657988/article/details/82969859
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞