工厂模式

概述

  • 满足OOP七大原则中:
    • 开闭原则
    • 依赖倒置法则
    • 迪米特法则

枚举工厂的实现

简单工厂模式

  • 类接口
public interface Car {
    void name();
}
  • 实现类
public class Audi implements Car {
    @Override
    public void name() {
        System.out.println("Audi");
    }
}
public class Auto implements Car {
    @Override
    public void name() {
        System.out.println("Auto");
    }
}
  • 工厂类
public class CarFactory {
    public static Car getAudi(){
        return new Audi();
    }
    public static Car getAuto(){
        return new Auto();
    }
}
  • 直接调用
public class Test {
    public static void main(String[] args) {
        CarFactory.getAudi().name();
        CarFactory.getAuto().name();
    }
}
  • 总结:不满足闭合原则(对扩展开放,对修改关闭),新增加实现类,需修改工厂类。

工厂方法模式

  • 在简单工厂模式的基础上,再抽象出工厂接口,每个实现类设置自己的工厂。
  • CarFactory
public interface CarFactory {
    Car getCar();
}
  • 工厂实现类
public class AudiFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Audi();
    }
}
public class AutoFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Auto();
    }
}
  • 测试类
public class Test {
    public static void main(String[] args) {
        new AudiFactory().getCar().name();
        new AutoFactory().getCar().name();
    }
}
  • 总结:工厂方法模式虽然满足设计原则,但复杂度更高;简单工厂模式更符合实际业务的选择。

抽象工厂模式

在这里插入图片描述在这里插入图片描述

  • 产品接口
public interface PhoneProuct {
    void start();
    void shutDown();
    void call();
    void sendMsg();
}
public interface RouterProduct {
    void start();
    void shutDown();
    void openWifi();
    void setting();
}
  • 产品品牌的实现类
public class XiaoMiPhone implements PhoneProuct {
    @Override
    public void start() {
        System.out.println("小米开机");
    }

    @Override
    public void shutDown() {
        System.out.println("小米关机");
    }

    @Override
    public void call() {
        System.out.println("小米打电话");
    }

    @Override
    public void sendMsg() {
        System.out.println("小米发短信");
    }
}
public class XiaoMiRouter implements RouterProduct {
    @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 PhoneProuct {
    @Override
    public void start() {
        System.out.println("华为开机");
    }

    @Override
    public void shutDown() {
        System.out.println("华为关机");
    }

    @Override
    public void call() {
        System.out.println("华为打电话");
    }

    @Override
    public void sendMsg() {
        System.out.println("华为发短信");
    }
}
public class HuaWeiRouter implements RouterProduct {
    @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 interface ProductFactory {
    //生产手机和路由器的工厂
    PhoneProuct phoneProuct();

    RouterProduct routerProduct();
}
  • 品牌工厂实现类
public class XiaoMiFactory implements ProductFactory {
    @Override
    public PhoneProuct phoneProuct() {
        return new XiaoMiPhone();
    }

    @Override
    public RouterProduct routerProduct() {
        return new XiaoMiRouter();
    }
}
public class HuaWeiFactory implements ProductFactory {
    @Override
    public PhoneProuct phoneProuct() {
        return new HuaWeiPhone();
    }

    @Override
    public RouterProduct routerProduct() {
        return new HuaWeiRouter();
    }
}

反射工厂

  • 汽车工厂
public class IcarFactory {
    private IcarFactory(){}

    private Icar icar;
    private static Properties properties;

    static {
        properties = new Properties();
        InputStream resourceAsStream = IcarFactory.class.getClassLoader().getResourceAsStream("car.properties");
        try {
            properties.load(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

	// 反射产生实例
    public static Icar getCar(String carName){
        String clazz = properties.getProperty(carName);
        try {
            Class<?> aClass = Class.forName(clazz);
            return (Icar) aClass.newInstance();
        } catch (ClassNotFoundException e) {
            return null;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return null;
    }

}
  • car.properties
bmw=com.javasm.factory.BMW
benz=com.javasm.factory.BENZ
  • Icar模板
public interface Icar {
    void run();
    void stop();
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值