工厂模式-cnblog

发布时间 2024-01-07 21:16:45作者: xyfyy

工厂模式

简单工厂模式(静态工厂模式)

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的代码,违反了开闭原则(软件实体应该对扩展开放,对修改关闭)。

工厂方法模式

image-20240107205504665

如图结构,简单来说就是将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();
    }
}