0
点赞
收藏
分享

微信扫一扫

【Java设计模式】007-简单工厂模式


目录

​​三、简单工厂模式​​

​​1、概述​​

​​2、应用场景​​

​​3、优缺点​​

​​优点​​

​​缺点​​

​​4、主要角色​​

​​5、代码实现​​

​​功能类​​

​​测试类​​

​​运行结果​​

​​四、工厂方法模式​​

​​1、概述​​

​​2、应用场景​​

​​3、优缺点​​

​​优点​​

​​缺点​​

​​4、主要角色​​

​​5、代码实现​​

​​功能类​​

​​测试类​​

​​运行结果​​

三、简单工厂模式

第二次梳理:对象的使用者不关心对象是如何创建的,对象的创建过程交给专门创建对象的工厂来完成,这就类似工厂生产产品一样,消费者不关心产品是如何被制造出来的,对于编程这适用于生成较为复杂的对象,将创建对象的过程进行封装以实现复用,减少使用的复杂度!时间:2021年05月13日 09时31分30秒

简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类或实现了共同的接口!在简单工厂模式中用于创建对象的方法通常都是静态的,因此简单工厂模式又被称为静态工厂方法!时间:2021年05月13日 10时10分18秒

仅有一个工厂,该工厂负责多个产品的生产!时间:2021年05月13日 11时22分52秒

1、概述

简单讲:工厂模式就是工厂负责创建对象,使用者不关心对象的创建过程;简单工厂模式就是定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类或实现了共同的接口!

现实生活中,原始社会自给自足(没有工厂),农耕社会小作坊(简单工厂,民间酒坊),工业革命流水线(工厂方法,自产自销),现代产业链代工厂(抽象工厂,富士康)。我们的项目代码同样是由简到繁一步一步迭代而来的,但对于调用者来说,却越来越简单。

在日常开发中,凡是需要生成复杂对象的地方,都可以尝试考虑使用工厂模式来代替。

注意:上述复杂对象指的是类的构造函数参数过多等对类的构造有影响的情况,因为类的构造过于复杂,如果直接在其他业务类内使用,则两者的耦合过重,后续业务更改,就需要在任何引用该类的源代码内进行更改,光是查找所有依赖就很消耗时间了,更别说要一个一个修改了。

工厂模式:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中(补充:这里的测试并不是这么是实现的,实际使用中可对代码进行调整。测试代码实现的是简单工厂模式!时间:2021年05月13日 09时34分50秒)。这满足创建型模式中所要求的“创建与使用相分离”的特点。

按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。

我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。

当要创建的产品不多,也就不需要每一个产品使用一个工厂了!可以向我的测试类写的那样,一个工厂负责创建多个产品!时间:2021年05月13日 09时53分26秒

在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple Factory Pattern)又叫作静态工厂方法模式(Static Factory Method Pattern)。

简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。简单工厂模式不在 GoF 23 种设计模式之列。

简单工厂模式每增加一个产品都要对工厂类进行修改,这增加了系统的复杂度,违背了“开闭原则”。

从这可以看出,教程本意确实与我写的测试类是不一致的(这里讲的内容应该是工厂方法模式),我的测试类对代码进行了简化,教程本意是创建一个抽象工厂接口,所有的具体工厂类实现这个接口,一个工厂对应一种产品的创建,使用哪个工厂创建产品就new哪个工厂指向抽象工厂接口,抽象工厂接口调取自己的方法即可实现对具体产品的创建。这种写法是相当麻烦有没有必要,因此还不如我在测试类中的写法,不需要抽象工厂接口,直接使用一个“复合”工厂来创建多个对象,需要什么对象,传进来相关参数,调用对应方法创建对象即可!时间:2021年05月13日 09时39分44秒

“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。

 

2、应用场景

对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。

 

3、优缺点

优点

  • 工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确;
  • 客户端无需知道所创建具体产品的类名,只需知道参数即可;
  • 也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类;

 

缺点

  • 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则;
  • 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度;
  • 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂;
  • 简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构;

 

4、主要角色

  • 简单工厂(Simple Factory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象;
  • 抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口;
  • 具体产品(Concrete Product):是简单工厂模式的创建目标;

 

5、代码实现

功能类

package com.zibo.design.one;

// 抽象产品
public interface Dog{
void sleep();
}

// 工厂
class Factory {
public static Dog createDog(String key){
switch (key){
case "大狗子":
return new BigDog();
case "小狗子":
return new LittleDog();
default:
throw new RuntimeException("工厂不生产这个品种的狗!");
}
}
}

// 具体产品1
class BigDog implements Dog {
@Override
public void sleep() {
System.out.println("大狗在睡觉!");
}
}

// 具体产品2
class LittleDog implements Dog {
@Override
public void sleep() {
System.out.println("小狗在睡觉!");
}
}

 

测试类

package com.zibo.design.one;

public class Test {
public static void main(String[] args) {
Factory.createDog("大狗子").sleep();
Factory.createDog("小狗子").sleep();
}
}

 

运行结果

大狗在睡觉!
小狗在睡觉!

 

四、工厂方法模式

这个工厂方法模式跟我之前学抽象工厂模式恰好相反!

1、概述

简单讲:抽象工厂提供创建产品的接口,每一个具体工厂创建一种具体的产品,使用者根据具体工厂,得到具体产品;

“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则;

满足开闭原则:当新增一个产品的时候只需要添加一个新的具体工厂,不需要修改原始代码;

 

2、应用场景

  • 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等;
  • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口;
  • 客户不关心创建产品的细节,只关心产品的品牌;

 

3、优缺点

优点

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
  • 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类;
  • 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则;

 

缺点

  • 类的个数容易过多,增加复杂度;
  • 增加了系统的抽象性和理解难度;
  • 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决;

 

4、主要角色

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品;
  • 具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建;
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能;
  • 具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应;

 

5、代码实现

功能类

package com.zibo.design.one;

// 抽象产品
public interface Dog{
void sleep();
}

// 抽象工厂
interface DogFactory{
Dog create();
}

// 具体工厂1
class BigDogFactory implements DogFactory{
public Dog create(){
return new BigDog();
}
}

// 具体工厂2
class LittleDogFactory implements DogFactory{
public Dog create(){
return new LittleDog();
}
}

// 具体产品1
class BigDog implements Dog {
@Override
public void sleep() {
System.out.println("大狗在睡觉!");
}
}

// 具体产品2
class LittleDog implements Dog {
@Override
public void sleep() {
System.out.println("小狗在睡觉!");
}
}

 

测试类

package com.zibo.design.one;

public class Test {
public static void main(String[] args) {
BigDogFactory bigDogFactory = new BigDogFactory();
bigDogFactory.create().sleep();
LittleDogFactory littleDogFactory = new LittleDogFactory();
littleDogFactory.create().sleep();
}
}

 

运行结果

大狗在睡觉!
小狗在睡觉!

 

 

 

 

 

 

 

 

 

举报

相关推荐

0 条评论