核心本质
① 实例化对象不使用new,用工厂方法代替
② 将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦
简单工厂
public interface Car {
void name();
}
public class Tesla implements Car{
@Override
public void name() {
System.out.println("特斯拉!");
}
}
public class WuLing implements Car{
@Override
public void name() {
System.out.println("五菱宏光!");
}
}
public class CarFactory {
public static Car getCar(String car){
if (car.equals("五菱")){
return new WuLing();
} else if (car.equals("特斯拉")) {
return new Tesla();
}else {
return null;
}
}
}
public class Consumer {
public static void main(String[] args) {
Car car = CarFactory.getCar("特斯拉");
car.name();
}
}
但是简单工厂模式我们如果还想添加车(新的类)就只能去动代码逻辑,违反了开闭原则。
工厂方法模式
工厂方法模式就可以不用动逻辑代码,思想就是为每个车都创建一个工厂,当我们需要添加新车时,需要为其创建一个工厂并实现公共工厂即可,也就不需要再去动代码
public interface Car {
void name();
}
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉!");
}
}
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五菱宏光!");
}
}
public interface CarFactory {
Car getCar();
}
public class WuLingFactory implements CarFactory{
@Override
public Car getCar() {
return new WuLing();
}
}
public class TeslaFactory implements CarFactory{
@Override
public Car getCar() {
return new Tesla();
}
}
public class Consumer {
public static void main(String[] args) {
Car car = new WuLingFactory().getCar();
Car car1 = new TeslaFactory().getCar();
car.name();
car1.name();
}
}
但是工厂方法模式每添加新车都会增加两个类,所以从结构、代码、管理的复杂度上来说都是简单工厂模式方便一点
抽象工厂模式
在工厂方法模式中,我们使用一个工厂创建一个产品,一个具体工厂对应一个具体产品,但有时候我们需要一个工厂能够提供多个产品对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式。围绕一个超级工厂创建其他工厂,该超级工厂又被称为其他工厂的工厂,就相当于在超级工厂接口和具体产品实现工厂类之间套了一层生产不同种类的产品的接口横向扩展了一哈
超级工厂
public interface IProductFactory {
//生产手机
IphoneProduct iphoneProduct();
//生产路由器
IRouterProduct routerProduct();
}
public interface IphoneProduct {
void start();
void shutdown();
void callup();
void sendSMS();
}
public interface IRouterProduct {
void start();
void shutdown();
void openWifi();
void setting();
}
public class XiaomiFactory implements IProductFactory{
@Override
public IphoneProduct iphoneProduct() {
return new XiaoMiPhone();
}
@Override
public IRouterProduct routerProduct() {
return new XiaoMiRouter();
}
}
public class HuaweiFactory implements IProductFactory{
@Override
public IphoneProduct iphoneProduct() {
return new HuaWeiPhone();
}
@Override
public IRouterProduct routerProduct() {
return new HuaWeiRouter();
}
}
public class XiaoMiPhone implements IphoneProduct{
@Override
public void start() {
System.out.println("小米手机开机!");
}
@Override
public void shutdown() {
System.out.println("小米手机关机!");
}
@Override
public void callup() {
System.out.println("小米手机打电话!");
}
@Override
public void sendSMS() {
System.out.println("小米手机发消息!");
}
}
public class XiaoMiRouter implements IRouterProduct {
@Override
public void start() {
System.out.println("启动小米路由器!");
}
@Override
public void shutdown() {
System.out.println("关闭小米路由器!");
}
@Override
public void openWifi() {
System.out.println("启动小米路由器Wifi!");
}
@Override
public void setting() {
System.out.println("启动小米路由器设置!");
}
}
public class HuaWeiPhone implements IphoneProduct{
@Override
public void start() {
System.out.println("华为开机!");
}
@Override
public void shutdown() {
System.out.println("华为关机!");
}
@Override
public void callup() {
System.out.println("华为打电话!");
}
@Override
public void sendSMS() {
System.out.println("华为发信息!");
}
}
public class HuaWeiRouter implements IRouterProduct{
@Override
public void start() {
System.out.println("启动HUAWEI路由器!");
}
@Override
public void shutdown() {
System.out.println("关闭HUAWEI路由器!");
}
@Override
public void openWifi() {
System.out.println("启动HUAWEI路由器Wifi!");
}
@Override
public void setting() {
System.out.println("启动HUAWEI路由器设置!");
}
}
public class Client {
public static void main(String[] args) {
System.out.println("===================小米系列===================");
XiaomiFactory xiaomiFactory = new XiaomiFactory();
IphoneProduct iphoneProductXiaomi = xiaomiFactory.iphoneProduct();
iphoneProductXiaomi.start();
iphoneProductXiaomi.callup();
IRouterProduct iRouterProductXiaomi = xiaomiFactory.routerProduct();
iRouterProductXiaomi.start();
System.out.println("===================华为系列===================");
HuaweiFactory huaweiFactory = new HuaweiFactory();
IphoneProduct iphoneProductHuawei = huaweiFactory.iphoneProduct();
iphoneProductHuawei.start();
iphoneProductHuawei.callup();
IRouterProduct iRouterProductHuawei = xiaomiFactory.routerProduct();
iRouterProductHuawei.start();
}
}