设计模式:工厂模式

场景:
有这么一个场景,我们有两种笔。如下图中的red和blue

设计模式:工厂模式_第1张图片
Pen.png

在客户端我们 可以根据颜色去选择哪一种笔。
则我们的代码可能在我们调用的时候这样写:

 Pen pen;
        if (colour.equals("red")) {
            pen = new RedPen();
        } else if (colour.equals("blue")) {
            pen = new BluePen();
        } else {
            pen = new RedPen();
        }

咋一看,其实没什么问题。但是,如果每次需要new 一个pen的时候都这么写,那该多麻烦,而且如果我加上一种颜色的笔比如black,则我们就得在每个调用的地方加上一个判断,这样就不符合开闭原则,且成本很大。这时候你可能会想我将这段代码提出来,这样就只需要修改一处便可。这就类似简单工厂模式了,代码如下:

/**
 * @author [email protected]
 * @date 2019-08-18 23:21
 */
public class SimpleFactory {

    public Pen getPen(String colour) {
        if (colour.equals("red")) {
            return new RedPen();
        } else if (colour.equals("blue")) {
            return new BluePen();
        } else {
            return new RedPen();
        }

    }

}

则我们调用:

        SimpleFactory simpleFactory = new SimpleFactory();
        System.out.println("这只笔的颜色是: " + simpleFactory.getPen(colour).colour);

这样你可能会想还需要new 一个SimpleFactory麻烦,你也可以采用静态方法,也就成为了静态工厂模式:

/**
 * @author [email protected]
 * @date 2019-08-18 23:23
 */
public class StaticSimpleFactory {

    public static Pen getPen(String colour) {
        if (colour.equals("red")) {
            return new RedPen();
        } else if (colour.equals("blue")) {
            return new BluePen();
        } else {
            return new RedPen();
        }
    }
}

客户端调用:

System.out.println("这只笔的颜色是: " + StaticSimpleFactory.getPen(colour).colour);

工厂方法模式
像上面这两种工厂模式其实只是我们编程的一种习惯,并不是一种设计模式。
真正的工厂模式是:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例推迟到子类。

设计模式:工厂模式_第2张图片
Pen.png

下面来看一个penFactory.

/**
 * @author [email protected]
 * @date 2019-08-18 23:25
 */
public interface PenFactory {
    Pen getPen();
}

------------RedPenFactory---------
/**
 * @author [email protected]
 * @date 2019-08-18 23:26
 */
public class RedPenFactory implements PenFactory {
    public Pen getPen() {
        return new RedPen();
    }
}
----------BluePenFactory--------
/**
 * @author [email protected]
 * @date 2019-08-18 23:27
 */
public class BluePenFactory implements PenFactory {

    public Pen getPen() {
        return new BluePen();
    }
}

//--------test------
 PenFactory penFactory = new RedPenFactory(); System.out.println("
这只笔的颜色是: " + penFactory.getPen().colour);

工厂模式的好处:
(1) 解耦 :把对象的创建和使用的过程分开
(2)降低代码重复: 如果创建某个对象的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。
(3) 降低维护成本 :由于创建过程都由工厂统一管理,所以发生业务逻辑变化,不需要找到所有需要创建对象B的地方去逐个修正,只需要在工厂里修改即可,降低维护成本。

抽象工厂方法模式:
在工厂方法模式中,其实我们有一个潜在意识的意识。那就是我们生产的都是同一类产品。抽象工厂模式是工厂方法的仅一步深化,在这个模式中的工厂类不单单可以创建一种产品,而是可以创建一组产品。
他与工厂方法模式的区别在于,工厂方法是面向一个产品,二抽象工厂方法模式是面向一组产品。
如上面的例子我们还需要一个笔出厂商(有可能这样不好理解,总之记住抽象工厂方法是面向的一组产品,也就是说一个工厂可以有多个产品),则可改成如下形势。

/**
 * @author [email protected]
 * @date 2019-08-18 23:25
 */
public interface PenFactory {
    Pen getPen();
    PenCanDi getPenCandi();
}

你可能感兴趣的:(设计模式:工厂模式)