工厂模式细分

几个步骤来分析JAVA的工厂模式

了解一下使用工厂模式的好处?

1.实例化对象不用new,用工厂代替
2.将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦
工厂模式不断改进有这三类:

1. 简单工厂模式

缺点:新增车辆要改动底层代码,违反了开闭原则

Bwm.java
public class Bwm implements Car{
 @Override
 public void name() {
  // TODO 自动生成的方法存根
   System.out.println("宝马!");
 }
}

Car.java

public interface Car {
   void name();
}

CarFactory.java

//静态工厂模式
public class CarFactory {
 //方法一 缺点就是新增车辆需要修改代码,违背了开闭原则
 //开闭原则 对拓展是开放的对修改是关闭的
 public static Car getCar(String car) {
  if(car.equals("五菱")) {
   return new Wuling();
  }else if(car.equals("宝马")) {
   return new Bwm();
  }else {
   return null;
  }
 }
 
 //方法二  仍然有这个缺点,只是不用修改逻辑
 public static Car getWuling() {
  return new Wuling();
 }
 public static Car getBwm() {
  return new Bwm();
 }
}

Wuling.java

public class Wuling implements Car {
 @Override
 public void name() {
  // TODO 自动生成的方法存根
   System.out.println("五菱宏光!");
 }
}

Consumer.java

public class Consumer {
 public static void main(String[] args) {
  // 接口,所有实现类:工厂
//         Car car=new Wuling();
//         Car car2=new Bwm();

  //使用工厂   
  Car car=CarFactory.getCar("五菱");
  Car car2=CarFactory.getCar("宝马");
         car.name();
         car2.name();
 }
}

在这里插入图片描述

2. 工厂方法模式

把CarFactory改为接口由车辆的工厂分别实现,这样新增的时候就只用加工厂就可以了
三个实体类不变Bwn,Wuling,MoBai+Car接口
缺点:每加一个实体多一个工厂,代码复杂,编程复杂,管理复杂,结构复杂

BwmFactory.java

public class BwmFactory implements CarFactory{
 @Override
 public Car getCar() {
  // TODO 自动生成的方法存根
  return new Bwm();
 }     
}

WulingFactory.java

public class WulingFactory implements CarFactory{
 @Override
 public Car getCar() {
  // TODO 自动生成的方法存根
  return new Wuling();
 }      
}

MoBaiFactory.java

public class MobaiFactory implements CarFactory {
 @Override
 public Car getCar() {
  // TODO 自动生成的方法存根
  return new MoBai();
 }
}

CarFactory.java

//工厂方法模式
public interface CarFactory {
    Car getCar();
}

Consumer .java

public class Consumer {
 public static void main(String[] args) {
  Car car=new WulingFactory().getCar();
  Car car2=new BwmFactory().getCar(); 
  car.name();
  car2.name();
  Car car3=new MobaiFactory().getCar();
  car3.name();  
 }
}

在这里插入图片描述

3. 抽象工厂模式

超级工厂,会生产工厂,不增加产品,可以增加产品系
超级工厂接口对应着手机产品接口和路由器产品接口
手机产品和路由器产品由各生产商实现,超级工厂不管

缺点:增加了系统的抽象性和理解难度

HuaweiFactory.java

public class HuaweiFactory implements ProductFactory {
 @Override
 public IphoneProduct iphoneProduct() {
  // TODO 自动生成的方法存根
  return new HuaweiiPhone();
 }
 @Override
 public IPRouteProduct routeProduct() {
  // TODO 自动生成的方法存根
  return new HuaweiiRouter();
 }
}

HuaweiiPhone.java

public class HuaweiiPhone implements IphoneProduct {
 @Override
 public void start() {
  // TODO 自动生成的方法存根
  System.out.println("开启华为手机");
 }
 @Override
 public void shutdown() {
  // TODO 自动生成的方法存根
  System.out.println("关闭华为手机");
 }
 @Override
 public void callup() {
  // TODO 自动生成的方法存根
  System.out.println("华为手机打电话");
 }
 @Override
 public void sendSMS() {
  // TODO 自动生成的方法存根
  System.out.println("华为手机发短信");
 }
}

HuaweiiRouter.java

public class HuaweiiRouter implements IPRouteProduct {
 @Override
 public void start() {
  // TODO 自动生成的方法存根
  System.out.println("启动华为路由器");
 }
 @Override
 public void shutdown() {
  // TODO 自动生成的方法存根
  System.out.println("关闭华为路由器");
 }
 @Override
 public void openWife() {
  // TODO 自动生成的方法存根
  System.out.println("打开华为swifi");
 }
 @Override
 public void setting() {
  // TODO 自动生成的方法存根
  System.out.println("华为设置");
 }
}

XiaomiFactory.java

public class XiaomiFactory implements ProductFactory {
 @Override
 public IphoneProduct iphoneProduct() {
  // TODO 自动生成的方法存根
  return new XiaomiPhone();
 }
 @Override
 public IPRouteProduct routeProduct() {
  // TODO 自动生成的方法存根
  return new XiaoiRouter();
 }
}

XiaomiPhone.java

public class XiaomiPhone implements IphoneProduct{
 @Override
 public void start() {
  // TODO 自动生成的方法存根
  System.out.println("开启小米手机");
 }
 @Override
 public void shutdown() {
  // TODO 自动生成的方法存根
  System.out.println("关闭小米手机");
 }
 @Override
 public void callup() {
  // TODO 自动生成的方法存根
  System.out.println("小米手机打电话");
 }
 @Override
 public void sendSMS() {
  // TODO 自动生成的方法存根
  System.out.println("小米手机发短信");
 }
}

XiaoiRouter.java

public class XiaoiRouter implements IPRouteProduct {
 @Override
 public void start() {
  // TODO 自动生成的方法存根
  System.out.println("启动小米路由器");
 }
 @Override
 public void shutdown() {
  // TODO 自动生成的方法存根
  System.out.println("关闭小米路由器");
 }
 @Override
 public void openWife() {
  // TODO 自动生成的方法存根
  System.out.println("打开小米wifi");
 }
 @Override
 public void setting() {
  // TODO 自动生成的方法存根
  System.out.println("小米设置");
 }
}

IPRouteProduct.java

public interface IPRouteProduct {
   void start();
   void shutdown();
   void openWife();
   void setting();
}

IphoneProduct.java

public interface IphoneProduct {
     void start();
     void shutdown();
     void callup();
     void sendSMS();
}

ProductFactory.java

//抽象产品工厂
public interface ProductFactory {
     //生产手机
 IphoneProduct iphoneProduct();
  //生产路由器
 IPRouteProduct routeProduct();
}

在这里插入图片描述
抽象工厂反思:

     1.JDK中Calendar的getInstance方法
     2.JDBC中的Connection对象的获取
     3.Spring中IOC容器创建管理bean对象
     4.反射中Class对象的newInstance方法
发布了52 篇原创文章 · 获赞 10 · 访问量 1512

猜你喜欢

转载自blog.csdn.net/jiohfgj/article/details/104369790