设计模式之工厂模式及抽象工厂模式

工厂模式:

作用:实现了创建者和调用者的分离**
分类:简单工厂模式、工厂方法模式、抽象工厂模式
**OOP七大原则:**开闭原则(有A和B,想扩展C,因此不要动A和B,可以在外面增加C,如果C对A和B有影响或者修改了原有代码就不可以了)、依赖倒置原
则(不需要每个类都要一个接口,可以提取公共接口)、迪米特法则
核心本质:
1.实例化对象不使用new,用工厂方法代替
2.将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。

简单工厂模式:
用来生产同一等级结构中的任意产品(对于增加新的产品,需要球盖已有的代码)

public interface Car {
    void name();
}


public class WuLing implements Car{
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}`

public class Tesla 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 static Car getWuling(){
        return new WuLing();
    }

    public static Car getTesla(){
        return new Tesla();
    }
}


public class Consumer {
    public static void main(String[] args) {
//        接口,所有的实现类
        WuLing wuLing = new WuLing();
        Tesla tesla = new Tesla();
        wuLing.name();
        tesla.name();

//        使用工厂创建(实例化对象不使用new,用工厂方法代替)
        Car car = CarFactory.getCar("五菱");
        Car car1 = CarFactory.getCar("特斯拉");
        car.name();
        car1.name();
    }
}

工厂方法模式:
用来生产同一等级结构中的固定产品(支持增加任意产品)

public class Consumer {
    public static void main(String[] args) {
//        接口,所有的实现类
        WuLing wuLing = new WuLing();
        Tesla tesla = new Tesla();
        wuLing.name();
        tesla.name();

//        使用工厂创建(实例化对象不使用new,用工厂方法代替)
        Car car = CarFactory.getCar("五菱");
        Car car1 = CarFactory.getCar("特斯拉");
        car.name();
        car1.name();
    }
}

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

public class Consumer {
    public static void main(String[] args) {
        Car car = new WuLingFactory().getCar();
        Car car1 = new TeslaFactory().getCar();

        car.name();
        car1.name();
    }
}

public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

public class TeslaFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

public class WuLing implements Car {
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}

public class WuLingFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new WuLing();
    }
}

应用场景:
1.JDK中Calendar的getInstance方法
2.JDBC中的Connection对象的获取
3.Spring中IOC容器创建管理bean对象
4.反射中Class对象的newInstance方法
**
抽象工厂模式:
围绕一个超级工厂创建其他工厂。这个超级工厂又称为其他工厂的工厂。
**定义:**抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,不需要指定它们具体的类

//手机产品接口
public interface IphoneProduct {
    void start();
    void shutdown();
    void callUp();
    void sendSMS();
}

//抽象产品工厂
public interface IProductFactory {

//    生产手机
    IphoneProduct iphoneProduct();


//    生产路由器
    IRouterProduct irouterProduct();
}

//路由器产品接口
public interface IRouterProduct {
//    开机
    void start();
//    关机
    void shutdown();

    void openWife();
//    设置wife密码
    void setting();
}

public class XiaomiIphone 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 XiaomiIRouter implements IRouterProduct{
    @Override
    public void start() {
        System.out.println("小米路由器开机");
    }

    @Override
    public void shutdown() {
        System.out.println("小米路由器关机");
    }

    @Override
    public void openWife() {
        System.out.println("小米路由器打开wife");
    }

    @Override
    public void setting() {
        System.out.println("小米路由器设置");
    }
}

public class XiaomiFactory implements IProductFactory{

    @Override
    public IphoneProduct iphoneProduct() {
        return new XiaomiIphone();
    }

    @Override
    public IRouterProduct irouterProduct() {
        return new XiaomiIRouter();
    }
}

public class HuaweiIphone 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 HuaweiIRouter implements IRouterProduct{
    @Override
    public void start() {
        System.out.println("华为路由器开机");
    }

    @Override
    public void shutdown() {
        System.out.println("华为路由器关机");
    }

    @Override
    public void openWife() {
        System.out.println("华为路由器打开wife");
    }

    @Override
    public void setting() {
        System.out.println("华为路由器设置");
    }
}

public class HuaweiFactory implements IProductFactory{
    @Override
    public IphoneProduct iphoneProduct() {
        return new HuaweiIphone();
    }

    @Override
    public IRouterProduct irouterProduct() {
        return new HuaweiIRouter();
    }
}

public class Client {
    public static void main(String[] args) {
//        小米工厂
        System.out.println("-----------------小米产品-----------------");
        XiaomiFactory xiaomiFactory = new XiaomiFactory();
        IphoneProduct iphoneProduct = xiaomiFactory.iphoneProduct();
        iphoneProduct.callUp();
        iphoneProduct.sendSMS();

        IRouterProduct iRouterProduct = xiaomiFactory.irouterProduct();
        iRouterProduct.openWife();
        iRouterProduct.setting();

//        华为工厂
        System.out.println("-----------------华为产品-----------------");
        HuaweiFactory huaweiFactory = new HuaweiFactory();
        IphoneProduct iphoneProduct1 = huaweiFactory.iphoneProduct();
        iphoneProduct1.sendSMS();;
        iphoneProduct1.callUp();

        IRouterProduct iRouterProduct1 = huaweiFactory.irouterProduct();
        iRouterProduct1.setting();;
        iRouterProduct1.openWife();
    }
}

适用场景:
1.客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
2.强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码
3.提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现

优点:
1.具体产品在应用层的代码隔离,无需关心创建的细节
2.将一个系列的产品统一到一起创建

缺点:
1.规定了所有可能被创建的产品集合,产品簇中扩展新的产品的困难
2.增加了系统的抽象性和理解难度

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值