这是啥?
这是一个工厂,一个生产对象的工厂,这跟现实中的工厂有很多相同的地方,比如汽车厂造车,手机厂造手机,近似于废话的描述,哈哈!!! 但是刚学的时候,有时候就是分不清啥跟啥算是一类。。
游戏里法师往往有三种职业(我当然知道不只三种),召唤师、战法和法师(我也知道还有火法、冰法、雷法。。。) 工厂模式目前为止它也有三种,简单、方法(困难)、抽象(地狱)
简单工厂
简单工厂的结果是这样的:
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了。。。
方法工厂
方法工厂解决了简单工厂开闭原则的问题,即:将要加进去的类型再开一个工厂出来,华为有华为的工厂,小米有小米的工厂,并且他们都实现自一个共同的手机工厂接口。
抽象工厂
方法工厂和抽象工厂容易混淆,刚开始你可能会觉得抽象工厂只是在方法工厂的基础上,往共同的工厂接口方法中多定义了几个方法而已。这其实没错,他们的代码结构其实是一模一样的,不过是多了一种产品类型而已。这里我的理解是,抽象工厂只是多引入了产品族的一概念。个人认为支持产品族的方法工厂就是抽象工厂。