本文参考的书籍是:大话设计模式
先说说三者的概念,是大家有一个大体的了解
简单工厂模式:创建一个工厂类,由这个工厂类去决定到底实例化哪一个对象(注:简单工厂模式不是23种设计模式之一)
工厂方法模式:工厂方法模式是简单工厂模式的进一步扩展,创建一个抽象工厂(工厂里仅仅有一个创建抽象产品的方法),所有的具体工厂均需要实现这个抽象工厂。工厂方法模式利用多态使得一个类的实例化延迟到子类。
抽象工厂模式:抽象工厂模式是工厂方法模式的扩展,创建一个抽象工厂(工厂里有多个创建抽象产品的方法),其余一样。
简单工厂类:
public class SimpleFactory {
public static LeiFei createGoodMan(String type){
LeiFei good_man = null;
switch (type) {
case "大学生":
good_man = new Undergraduate();
break;
case "志愿者":
good_man = new Volunteer();
break;
}
return good_man;
}
}
但是它也存在着一定的缺点——就是违背了对扩展开放,对修改封闭的原则。
当需要添加要实例化的类型时,只需要修改添加case语句即可,完全屏蔽了客户端与具体实例之间的依赖关系,但是它也存在着一定的缺点——就是违背了对扩展开放,对修改封闭的原则。
为了弥补这个缺点,有引入了工厂方法模式。
工厂方法:
可以先创建一个工厂接口:
public interface Factory {
public LeiFei createGoodMan();
}
然后创建各种实现类,用来进行实例化各种具体的类:
public class UndergraduateFactory implements Factory{
@Override
public LeiFei createGoodMan() {
// TODO Auto-generated method stub
return new Undergraduate();
}
}
public class VolunteerFactory implements Factory{
@Override
public LeiFei createGoodMan() {
// TODO Auto-generated method stub
return new Volunteer();
}
}
当我们继续添加需要实例化的类型时,只需要创建实现Factory接口的子类即可。
这样也符合了开放——关闭原则了。
所以可以这么说工厂方法模式是简单工厂模式的进一步优化。
但是这同样存在一个问题:正如现实中的工厂一样,有的工厂不可能仅仅只生产一种产品,可能生产一系列的产品,如Apple不仅生产iPhone而且也生产iWatch一样
为了解决这个问题,又对工厂方法模式进行了扩展,形成了抽象工厂模式
抽象工厂模式:
先创建一个抽象工厂:
先创建一个抽象工厂:
interface IFactory{
public Iphone createPhone();
public Iwatch createWatch();
}
由具体的工厂来生产具体的产品
class Apple implements IFactory{
@Override
public Phone createPhone() {
// TODO Auto-generated method stub
//生产IPhone手机
return new Iphone();
}
@Override
public Watch createWatch() {
// TODO Auto-generated method stub
//生产iWatch
return new Iwatch();
}
}
在客户端我们可以这样写
class Client{
public static void main(String[] args) {
IFactory factory = new Apple();
factory.createPhone();
factory.createWatch();
}
}
简单工厂最大的好处就是:便于改变产品系列。当我们此时想生产华为的手机与智能手表是,只需要添加具体的Huawei类,并且实现IFactory接口,然后修改客户端代码成为如下所示即可:
class Client{
public static void main(String[] args) {
IFactory factory = new Huawei();
factory.createPhone();
factory.createWatch();
}
}
这符合
开放——关闭原则。
总结:
总的来说,简单工厂模式相当于在一个工厂生产多个具体的产品,并且由简单工厂来决定生产哪一个产品——但是当需要添加产品的时候,会破坏开放关闭原则,因为需要修改简单工厂类;
工厂方法模式相当于一个工厂只生产一种具体的产品,这弥补了简单工厂模式的不足。
抽象工厂模式是相当于一个集团,下面有多子公司,这些子公司可以生产不止一种具体产品。