热门课程

免费试听

上课方式

开班时间

当前位置: 首页 -   文章 -   根域文章 -   正文

java的工厂模式是什么

zhiliaoadmin
2021-03-08 14:10:45
0

工厂模式

image-20210303223011891

  • 作用:

    • 实现了创建者和调用者的分离

    • 实例化对象不使用new,用工厂方法替代

    • 将选择实现类,创建对象统一管理和控制。从而将调用这跟我们的实现类解耦。

  • 详细分类:

    • 简单工厂模式

    • 用来生产同一等级结构中的任意产品(对于增加新的产品,需要扩展已有代码)

    • 工厂方法模式

    • 用来生产同一等级结构中的固定产品(支持增加任意产品)

    • 抽象工厂模式

    • 围绕一个超级工厂创建其他工厂。该超级工厂称为其他工厂的工厂。

  • OOP七大原则

    • 开闭原则:一个软件的实体应当对扩展开放

    • 依赖倒置原则:要针对接口编程,不要针对实现编程

    • 迪米特法则:只与你直接的朋友通信,而避免和陌生人通信

1. 简单工厂模式(静态工厂)

某种程度上不符合设计原则,但实际使用最多。

原始方法

java public interface Car { public void name(); } public class Tesla implements Car{ public void name(){ System.out.println("特斯拉!"); }} public class WuLing implements Car{ public void name(){ System.out.println("五菱宏光!"); }} public class Consumer { public static void main(String[] args) { // 接口,所有实现类 Car car=new WuLing(); Car car2=new Tesla(); car.name(); car2.name(); // Car car = CarFactory.getCar("五菱"); // car.name(); }}

运行截图

image-20210203114241055

这种方法需要知道所有接口和实现类才能调用

静态工厂方法

因为CarFactory类中的所有方法都是静态的,需要向其中添加参数来返回不同的对象实例。

增加一个新的产品,如果不修改CarFactory代码就做不到。

java 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) { // 接口,所有实现类 // Car car=new WuLing(); // Car car2=new Tesla(); // car.name(); // car2.name(); Car car = CarFactory.getCar("五菱"); Car car2 = CarFactory.getCar("特斯拉"); car.name(); car2.name(); }}

运行截图

image-20210203114142962

图形描述:

image-20210303125913177

代码分析:

  • 在这种工厂实现的情况下增加新的产品(类)实现起来会比较复杂。需要修改CarFactory类,因此违反了开闭原则。

  • 虽然方法二比方法一添加新的类不需要修改内部逻辑、更加简单,但方法一与方法二本质上都是需要在原来代码的基础上增加新的代码才能添加新的产品(类),依旧不满足不修改原油代码的要求。

2. 工厂方法模式

不修改已有类的前提下,可以增加产品类。

java public interface CarFactory { Car getCar(); } public class TeslaFactory implements CarFactory { public Car getCar() { return new Tesla(); }} public class WuLingFactory implements CarFactory { @Override public Car getCar() { return new WuLing(); }} public class Consumer { public static void main(String[] args) { Car car = new WuLingFactory().getCar(); Car car1 = new TeslaFactory().getCar(); car.name(); car1.name(); }}

运行截图:

image-20210203122009442

新增一个产品

java public class DaZhong implements Car{ @Override public void name() { System.out.println("大众!"); }} public class DaZhongFactory implements CarFactory { @Override public Car getCar() { return new DaZhong(); }} public class Consumer { public static void main(String[] args) { Car car = new WuLingFactory().getCar(); Car car1 = new TeslaFactory().getCar(); car.name(); car1.name(); Car car2 = new DaZhongFactory().getCar(); car2.name(); }}

运行截图:

image-20210203122232410

图形描述:

image-20210303130230077

对比

  • 结构复杂度:simple更简单

  • 代码复杂度:simple更简单

  • 编程复杂度:simple更简单

  • 管理上的复杂度:simple更简单

根据设计原则:工厂方法模式

根据实际业务:简单工厂模式

3、抽象工厂模式

  • 定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类

  • 适用场景:

    • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节

    • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码(一次一起全部创建,很少更改)

    • 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现

  • 优点:

    • 具体产品在应用层的代码隔离无需关心创建的细节

    • 将一个系列的产品统一到一起创建

  • 缺点:

    • 规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难;

#### 今天就分享到这里啦

image-20210303222754312


大家都在看

知了堂ZVipPad 4.0版本升级,赋能IT学...

2021-03-08 浏览次数:0

渗透测试好学吗?渗透测试应该掌握什么技术?

2021-03-08 浏览次数:0

It培训机构靠不靠谱?就业真的可信吗?

2021-03-08 浏览次数:0

直播课 | 应届生如何拿下月薪14K?大专生如何...

2021-03-08 浏览次数:0

网络安全渗透测试工程师好就业吗?深度了解渗透测试...

2021-03-08 浏览次数:0

软件测试的流程一般分哪几个步骤?软件测试初学者必...

2021-03-08 浏览次数:0
最新资讯