Java设计模式——工厂模式

大家好,我是Morning,在CSDN写文,分享一些Java基础知识,一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步。感兴趣的欢迎关注博主,和博主一起学习Java知识。大家还可以去专栏查看之前的文章,希望未来能和大家共同探讨技术。

工厂模式

思想就是为了创建者和调用者分离。

满足开闭原则,依赖倒置原则,迪米特法则

在实例化对象的时候不使用new,就是将实现类,创建对象统一管理和控制,将调用者跟我们实现类解耦。

静态工厂模式

定义一个接口:

public interface Person {
    void name();
}

定义实现类:

public class Student implements Person{

    @Override
    public void name() {
        System.out.println("我是学生!");
    }
}
public class Teacher implements Person{

    @Override
    public void name() {
        System.out.println("我是老师!");
    }
}

创建工厂类:

public class MyFactory {
    public static Person getPerson(String person) {
        if (person.equals("学生")) {
            return new Student();
        } else if (person.equals("老师")) {
            return new Teacher();
        } else {
            return null;
        }
    }
}

当我们需要哪个实现类的时候调用工厂中的方法,传入具体的参数,就可以得到想要的实例对象。

这样的工厂模式有一个缺点,那就是,当你需要创建其他的实现类时,就要修改工厂类,这不符合开闭原则。也就是说当你添加一个产品时就必须修改代码。根据实际业务来说,静态工厂模式比较友好。

工厂方法模式

与静态工厂模式不同的是,我们创建一个工厂接口,使得每个产品有属于自己的工厂,然后这个工厂实现这个工厂接口。

这样的话,添加新产品时就不需要修改原来有的代码,只需要为新的产品添加一个新的工厂就可以。但是这样带来的问题就是,代码量增加。工厂方法模式更符合设计原则。

抽象工厂模式

围绕一个超级工厂创建其他的工厂,超级工厂就是其他工厂的工厂。也就是给工厂创建了工厂。

首先来了解俩个概念:

  1. 产品等级:说白了就是同一种类型的产品叫做同一个产品等级,就像各种牌子的手机都是属于同一产品等级。

  2. 产品族:说白了就可以理解为同一个牌子,小米旗下的手机,手表,电脑,属于同一产品族。

代码实现:

首先创建俩种产品(俩个产品等级)的接口:

//手机产品接口
public interface PhoneProduct {
    void run();   //开机
    void down();  //关机
}
//手表产品接口
public interface WatchProduct {
    void setting();  //设置时间
    void lookTime();     //查看时间
}

然后创建俩类产品的实现类:

//华为手机
public class HuaweiPhone implements PhoneProduct{

    @Override
    public void run() {
        System.out.println("huawei开机");
    }

    @Override
    public void down() {
        System.out.println("huawei关机");
    }
}
//oppo手机
public class OppoPhone implements PhoneProduct{

    @Override
    public void run() {
        System.out.println("oppo开机");
    }

    @Override
    public void down() {
        System.out.println("oppo关机");
    }
}
//华为手表
public class HuaweiWatch implements WatchProduct{

    @Override
    public void setting() {
        System.out.println("设置huawei手表");
    }

    @Override
    public void lookTime() {
        System.out.println("用huawei手表查看时间");
    }
}
//oppo手表
public class OppoWatch implements WatchProduct{

    @Override
    public void setting() {
        System.out.println("设置oppo手表");
    }

    @Override
    public void lookTime() {
        System.out.println("用oppo手表查看时间");
    }
}

然后创建一个产品工厂:

//分为俩个产品等级
public interface ProductFactory {
    PhoneProduct phoneProduct();
    WatchProduct watchProduct();
}

然后创建俩个产品族的工厂:

//华为
public class HuaweiFactory implements ProductFactory{
    @Override
    public PhoneProduct phoneProduct() {
        return new HuaweiPhone();
    }

    @Override
    public WatchProduct watchProduct() {
        return new HuaweiWatch();
    }
}
//oppo
public class OppoFactory implements ProductFactory{
    @Override
    public PhoneProduct phoneProduct() {
        return new OppoPhone();
    }

    @Override
    public WatchProduct watchProduct() {
        return new OppoWatch();
    }
}

在使用时,需要用一个产品族的工厂来获得不同产品等级的产品对象。代码如下:

public class test {
    public static void main(String[] args) {
        //oppo
        OppoFactory oppoFactory = new OppoFactory();
        PhoneProduct phoneProduct = oppoFactory.phoneProduct();
        phoneProduct.run();
        phoneProduct.down();
        WatchProduct watchProduct = oppoFactory.watchProduct();
        watchProduct.setting();
        watchProduct.lookTime();
        System.out.println("====================");
        //华为
        HuaweiFactory huaweiFactory = new HuaweiFactory();
        phoneProduct = huaweiFactory.phoneProduct();
        phoneProduct.run();
        phoneProduct.down();
        watchProduct = huaweiFactory.watchProduct();
        watchProduct.setting();
        watchProduct.lookTime();
    }

}

在这个案例里面,超级工厂就是ProductFactory接口。

优点:无需关心创建细节,将一个产品族的对象统一到一起创建。

缺点:产品族中扩展新产品困难,增加了抽象性和理解难度。

好了,本次的分享到这里就结束了。感谢您的阅读。博主会在日后给大家分享关于设计模式的其他的知识,和大家一起探讨,有兴趣的可以关注博主。文中有什么不当的地方,欢迎大家在评论区指出,大家一起探讨、学习。🤞🤞🤞

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值