几个步骤来分析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方法