设计模式扫盲 - 工厂模式

184 阅读3分钟

这是啥?

这是一个工厂,一个生产对象的工厂,这跟现实中的工厂有很多相同的地方,比如汽车厂造车,手机厂造手机,近似于废话的描述,哈哈!!! 但是刚学的时候,有时候就是分不清啥跟啥算是一类。。

游戏里法师往往有三种职业(我当然知道不只三种),召唤师、战法和法师(我也知道还有火法、冰法、雷法。。。) 工厂模式目前为止它也有三种,简单、方法(困难)、抽象(地狱)

简单工厂

简单工厂的结果是这样的:

public class Demo {
    public static void main(String[] arg) {
        PhoneFactory factory = new PhoneFactory();              
        Phone miPhone = factory.makePhone("MiPhone");            //注意这个地方!
        IPhone iPhone = (IPhone)factory.makePhone("iPhone");     //注意这个地方 too!
    }
}
有中文的地方就是重点:

想通过一个方法,用不同的参数来获取对应的对象,咋办嘞?没错就是你想的 if else嘛。。但是!!!

不同对象怎么通过同一个方法进行反回呢?

我们知道每个方法只能有一个返回类型,解决办法是用接口。

手机类接口
public interface Phone {
    void init();
}
小米手机
public class MiPhone implements Phone {
    public MiPhone() {
        this.init();
    }
    @Override
    public void init() {
        // TODO Auto-generated method stub
        System.out.println("make xiaomi phone!");
    }
}
苹果手机
public class IPhone implements Phone {
    public IPhone() {
        this.init();
    }
    @Override
    public void init() {
        // TODO Auto-generated method stub
        System.out.println("make iphone!");
    }
}

这两货都实现了Phone这个接口,那工厂就能这样写了:

public class PhoneFactory {
    public Phone makePhone(String phoneType) {
        if(phoneType.equalsIgnoreCase("MiPhone")){
            return new MiPhone();  //伏笔警告!
        }
        else if(phoneType.equalsIgnoreCase("iPhone")) {
            return new IPhone();
        }
        return null;
    }
}

这样一个方法就能返回实现了Phone的各种对象了。那位道友说了:这样是不是会不太好啊?得必须实现这个接口?
对的!必须得实现!而且后面的也是这吊样。。。
相对于这个还有另一个麻烦很多的问题:
有些情况下,小米手机不是那么好造的!代码伏笔那边有时候会有十几二十行,而且咋们还有华为、vivo、oppo等等还没加进去,这样撸个上千行指日可待啦,到时候光是拉滚动条都得拉半天。。。

然后它就lei了。。。

方法工厂

方法工厂解决了简单工厂开闭原则的问题,即:将要加进去的类型再开一个工厂出来,华为有华为的工厂,小米有小米的工厂,并且他们都实现自一个共同的手机工厂接口。

抽象工厂

方法工厂和抽象工厂容易混淆,刚开始你可能会觉得抽象工厂只是在方法工厂的基础上,往共同的工厂接口方法中多定义了几个方法而已。这其实没错,他们的代码结构其实是一模一样的,不过是多了一种产品类型而已。这里我的理解是,抽象工厂只是多引入了产品族的一概念。个人认为支持产品族的方法工厂就是抽象工厂。