场景:
有这么一个场景,我们有两种笔。如下图中的red和blue
在客户端我们 可以根据颜色去选择哪一种笔。
则我们的代码可能在我们调用的时候这样写:
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 zhaokai008@ke.com
* @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 zhaokai008@ke.com
* @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);
工厂方法模式
像上面这两种工厂模式其实只是我们编程的一种习惯,并不是一种设计模式。
真正的工厂模式是:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例推迟到子类。
下面来看一个penFactory.
/**
* @author zhaokai008@ke.com
* @date 2019-08-18 23:25
*/
public interface PenFactory {
Pen getPen();
}
------------RedPenFactory---------
/**
* @author zhaokai008@ke.com
* @date 2019-08-18 23:26
*/
public class RedPenFactory implements PenFactory {
public Pen getPen() {
return new RedPen();
}
}
----------BluePenFactory--------
/**
* @author zhaokai008@ke.com
* @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 zhaokai008@ke.com
* @date 2019-08-18 23:25
*/
public interface PenFactory {
Pen getPen();
PenCanDi getPenCandi();
}