设计模式-工厂模式简单介绍

1、什么是工厂模式?

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

  这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。创建对象时,不会对客户端暴露具体创建逻辑,只是提供统一创建的接口。可以满足不同条件下,创建不同的对象。

2、对象的职责有哪些?常见创建对象的方式有哪些?

  答:对象职责:对象本身所具有的职责、创建对象的职责和使用对象的职责

 创建对象方式:

  (1) 使用new关键字直接创建对象;

  (2) 通过反射机制创建对象;

  (3) 通过clone()方法创建对象;

  (4) 通过工厂类创建对象。

3、工厂模式设计的意图?

  答:(1)工厂模式主要是为对象创建提供统一的接口,即封装对象创建的方法。而且强调的重点是:将不同对象的创建与对象使用(或业务逻辑)进行分离,达到“单一职责”的目的。

 简单说明:有两个对象A、B,两者之间关系:A可以创建B,A也可以使用B,但是不能二者关系都存在。这也是工厂模式设计的原因之一。

  (2防止用来实例化一个类的数据和代码在多个类中到处都是,可以将有关创建的知识搬移到一个工厂类

4、使用场景?

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

5、设计模式?或者设计思路?

  答:专门定义一个类(如上文中的CarFactory1、CarFactory2、CarFactory3)来负责创建其它类的实例,由它来决定实例化哪个具体类,从而避免了在客户端代码中显式指定,实现了解耦。该类由于可以创建同一抽象类(或接口)下的不同子类对象,就像一个工厂一样,因此被称为工厂类。

先介绍未使用工厂模式的方式:

class Shape {  
    private String type; //形状类型
    public Shape(Object[][] data, String type) {  
        this.type = type;  
        if (type.equalsIgnoreCase("Square")) {  
            //初始方形图  
        }  
        else if (type.equalsIgnoreCase("circle")) {  
            //初始化圆形图  
        }  
        else if (type.equalsIgnoreCase("Rectangle")) {  
            //初始化三角形图  
        }  
    }
    public void display() {  
        if (this.type.equalsIgnoreCase("Square")) {  
            //显示方形图  
        }  
        else if (this.type.equalsIgnoreCase("circle")) {  
            //显示圆形图  
        }  
        else if (this.type.equalsIgnoreCase("Rectangle")) {  
            //显示三角形图  
        }     
    }  
}

Shape类是一个“巨大的”类,在该类的设计中存在如下几个问题:

  (1)整个类代码相当冗长,如果有更多条件语句,代码的阅读、维护和测试都会变得很难;而且会影响系统的性能;每次创建对象,都需要大量的初始化设置,代码重复性太多。

  (2) Shape类,包括对象创建与对象行为等功能,违反了“单一职责原则”,不利于类的重用和维护;而且将大量的对象初始化代码都写在构造函数中,对象在创建时需要进行条件判断,降低了对象创建的效率。

  (3) 当需要增加新类型时,必须修改Shape类的源代码,违反了“开闭原则”。

  (4) 只能通过new来创建Shape对象,且与客户端类耦合度较高,无法分离对象的创建和使用。

  (5) 客户端在创建Shape对象之前可能还需要进行大量初始化设置,例如设置柱状图的颜色、高度等,如果在Shape类的构造函数中没有提供一个默认设置,那就只能由客户端来完成初始设置,这些代码在每次创建Shape对象时都会出现,导致代码的重复。

  面对一个如此巨大、职责如此重,且与客户端代码耦合度非常高的类,我们应该怎么办?简单工厂模式、工厂方法模式、抽象工厂模式,将在一定程度上解决上述问题

posted @ 2018-03-27 21:49  小码农成长记  阅读(134)  评论(0)    收藏  举报