工厂模式
简单工厂模式(静态工厂模式)
public interface Phone {
void getBrand();
}
public class Meizu implements Phone {
@Override
public void getBrand() {
System.out.println("魅族");
}
}
public class Xiaomi implements Phone {
@Override
public void getBrand() {
System.out.println("小米");
}
}
public class PhoneFactory{
public static Phone getPhone(String phone){
if("小米".equals(phone)){
return new Xiaomi();
}else if ("魅族".equals(phone)){
return new Meizu();
}else {
return null;
}
}
}
public class Customer {
public static void main(String[] args) {
PhoneFactory.getPhone("Xiaomi").getBrand();
PhoneFactory.getPhone("Meizu").getBrand();
}
}
上述代码,Customer,可以直接通过工厂类的getPhone方法,获取到特定类型的手机实体类。相当于将创建对象的过程交给了Factory来完成,自己只需要提供类型参数即可。
存在的问题:当手机品牌增多,需要不断去修改Factory的代码,违反了开闭原则(软件实体应该对扩展开放,对修改关闭)。
工厂方法模式
如图结构,简单来说就是将Factory从一个整体分开出来,变成多个不同的工厂类型。从而当增加新的手机品牌,需要去创建新的Factory, 这样就不用去修改现有的代码,只需要拓展新的代码即可。但是存在的问题也显然易见:后期需要创建的Factory太多了,增加了代码的复杂度。
public interface PhoneFactory {
Phone getPhone();
}
public class XiaomiFactory implements PhoneFactory {
@Override
public Phone getPhone() {
return new Xiaomi();
}
}
public class MeizuFactory implements PhoneFactory{
@Override
public Phone getPhone() {
return new Meizu();
}
}
抽象工厂设计模式
实话讲,看了这个感觉和抽象方法模式没有本质的区别,其区别在于抽象工厂中方法个数不同,抽象产品的个数也不同。可以更好的去构造产品族这个概念,比如小米家产品工厂、华为家产品工厂。
代码结构如下:
public interface ProductFactory {
Phone getPhone();
Router getRouter();
}
public class XiaomiFactory implements ProductFactory {
@Override
public Phone getPhone() {
return new XiaomiPhone();
}
@Override
public Router getRouter() {
return new XiaomiRouter();
}
}
public class HuaweiFactory implements ProductFactory {
@Override
public Phone getPhone() {
return new HuaweiPhone();
}
@Override
public Router getRouter() {
return new HuaweiRouter();
}
}