Java设计模式 之 工厂模式及抽象工厂模式
工厂模式
假设有个需求为 生产手机 及 测试手机是否通过测试 ,一般我们会编写手机的接口及增加测试接口以统一手机类,代码如下:
public interface Phone {
boolean testPassed();
}
public class HuaweiPhone implements Phone{
@Override
public boolean testPassed() {
//测试不通过
return false;
}
}
public class XiaomiPhone implements Phone{
@Override
public boolean testPassed() {
//测试通过
return true;
}
}
我们在商城获取手机,代码如下:
public class PhoneStore {
public static void main(String[] args) {
Phone phone = createPhone("xiaomi");
}
private static Phone createPhone(String type) {
Phone phone = null;
if (type.equals("huawei")) {
phone = new HuaweiPhone();
} else if (type.equals("xiaomi")) {
phone = new XiaomiPhone();
}
return phone;
}
}
在上述的代码我们发现createPhone单独写个方法,不利于其他的地方的调用,我们可以提取到一个工厂类中,代码如下:
public class PhoneTestFactory {
public static Phone createPhone(String type) {
Phone phone = null;
if (type.equals("huawei")) {
phone = new HuaweiPhone();
} else if (type.equals("xiaomi")) {
phone = new XiaomiPhone();
}
return phone;
}
}
我们就可以描述上述的为 简单工厂模式,可以放在其他地方使用。
但假设产品这时候需要为 只单独为小米工厂生产手机,我们会发现好像在简单的工厂模式中增加类别,会使这个类的产品线变的不清晰且不易控制,这时候我们可以把工厂类提取出来,代码如下:
public interface IPhoneFactory {
Phone createPhone(String type);
}
在制造单独的小米工厂生产手机,华为代码类似:
public class XiaomiPhoneFactory implements IPhoneFactory{
@Override
public Phone createPhone(String type) {
Phone phone = null;
if (type.equals("hongmi")) {
phone = new HuaweiPhone();
} else if (type.equals("xiaomi")) {
phone = new XiaomiPhone();
}
return phone;
}
}
这样我们就有单独的产品线,这就是 工厂模式,可以为小米和华为工厂单独制造各自的品牌手机,所以 工厂方法模式 是 简单工厂模式 的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
抽象工厂模式
现在大家已经知道 工厂模式,但假设现在手机厂商不满足只生产手机还想制造平板获利,在这我们可以看到手机和平板属于一个产品族,这时候原本的接口好像不能满足我们,我们可以使用 抽象工厂模式 ,代码如下:
public interface IDigitalFactory {
Phone createPhone(String type);
Pad createPad(String type);
}
上面的代码就能符合我们制定手机和平板的需求,各厂商可以根据自己的需求实现相关方法。
抽象工厂模式 其实是 工厂方法模式 的升级版本,用来创建一组相关或者相互依赖的对象,可以说是相同的产品族(手机与平板,手机配件等)。
抽象工厂也可以服务与产品的相关产品族,给手机使用,比如下面的代码:
//配件工厂
public interface IAccessoriesFactory {
//耳机
void createHeadset();
//钢化膜
void createSteelFilm();
//保护套
void createProtector();
}
上面就是 抽象工厂模式,一般用于制定 产品族 的关系,工厂模式一般制定的是 单一产品。
其他模式可点击链接进目录阅读了解:http://blog.csdn.net/xiao_wanzi94/article/details/78118092