设计模式(3)创建型模式 - 简单工厂模式

前言

前面大致懂了使用UML去表示模型
设计模式七大原则则是设计模式的总体思想
接下来看看具体的设计模式

目录

  1. 设计模式
  2. 创建型模式
  3. 简单工厂模式
    3.1. 模式定义
    3.2. 模式结构
    3.3. 模式实例
  4. 简单工厂模式的优缺点
  5. 简单工厂模式适用场景
  6. 模式简化
  7. 总结

设计模式

设计模式有23种
可以通过不同的分法分类
最常见的是根据目的分类
创建型模式(五种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式(七种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式(十一种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

简单工厂模式属于创建型模式,但不属于23种设计模式,可以看做特殊的工厂方法模式

创建型模式

创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则

意思就是:对象的创建由相关的工厂来完成,用户只需要使用就可以了

简单工厂模式

模式定义

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类

模式结构

在这里插入图片描述

  • Factory(工厂):核心部分,负责实现创建所有产品的内部逻辑,工厂类可以被外界直接调用,创建所需对象

  • Product(抽象类产品):工厂类所创建的所有对象的父类,封装了产品对象的公共方法,所有的具体产品为其子类对象

  • ConcreteProduct(具体产品):简单工厂模式的创建目标,所有被创建的对象都是某个具体类的实例。它要实现抽象产品中声明的抽象方法(有关抽象类)

模式实例

不需要知道产品类的名字,只需要知道表示产品的一个参数,把参数传入方法就可以获得对象

汽车工厂:

package com.company.DesignPatterns;

abstract class CarFactory {
    String carType;
    abstract void produce();
}

class BMW extends CarFactory{

    @Override
    void produce() {
        System.out.println("生产宝马中:"+carType+"生产成功");
    }
}

class AE extends CarFactory{

    @Override
    void produce() {
        System.out.println("生产AE86:"+carType+"生产成功");
    }
}

class Productor{
    public static void main(String [] args){
        BMW bmw=new BMW();
        bmw.carType="宝马";
        bmw.produce();
        AE ae=new AE();
        ae.carType="AE86";
        ae.produce();
    }
}

在工厂类中,每创建一种汽车都需要new一个对象,实例化类会造成耦合性高

使用简单工厂模式:
在这里插入图片描述

package com.company.DesignPatterns;

abstract class CarFactory {
    String carType;
    abstract void produce();
}
//生产BMW
class BMW extends CarFactory{

    public BMW( String carType) {
        this.carType=carType;
    }

    @Override
    void produce() {
        System.out.println("生产宝马中:"+carType+"生产成功");
    }
}
//生产AE
class AE extends CarFactory{
    public AE( String carType) {
        this.carType=carType;
    }
    @Override
    void produce() {
        System.out.println("生产AE86:"+carType+"生产成功");
    }
}
//简单工厂
class FactoryProCar{

    public static CarFactory producetCar(String carType){
        switch (carType){
            case "BMW":
                return new BMW("BMW");
            case "AE86":
                return new AE("AE86");
        }
        return null;
    }
}
//用户需要的创建类
class Productor{
    public static void main(String [] args){
        FactoryProCar.producetCar("AE86").produce();
    }
}



在这里插入图片描述

即现在只需要将Productor类给用户使用,用户传递什么参数就可以创建什么对象

简单工厂模式的优缺点

优点:

  • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象
  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量
  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性

缺点:

  • 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响
  • 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度
  • 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护
  • 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构

简单工厂模式适用场景

前面优缺点说的很明白,简单工厂模式让责任分割

适用于:客户端只知道传入工厂类的参数,对于如何创建对象不关心的场景

会提高系统复杂度

适用于:工厂类负责创建的对象比较少的场景:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂

应用

其实在JDK类库中广泛使用了简单工厂模式

工具类java.text.DateFormat,它用于格式化一个本地日期或者时间
在这里插入图片描述
在这里插入图片描述这种方法都是简单工厂模式

Java:DES加密方法

模式简化

产生那些子类、工厂类太麻烦了,有些情况下可以将抽象类当做工厂类使用

abstract class CarFactory {
    String carType;

    CarFactory(String carType) {
        this.carType = carType;
    }

    abstract void produce();

    public static CarFactory producetCar(String carType){
        switch (carType){
            case "BMW":
                return new CarFactory("BMW") {
                    @Override
                    void produce() {
                        System.out.println("生产宝马中:"+carType+"生产成功");
                    }
                };
            case "AE86":
                return new CarFactory("AE86") {
                    @Override
                    void produce() {
                        System.out.println("生产AE86:"+carType+"生产成功");
                    }
                };
        }
        return null;
    }
}

class Productor{
    public static void main(String [] args) {
        CarFactory.producetCar("AE86").produce();
    }
}

在这里插入图片描述

总结

  • 23种设计模式根据目的可分为三类:创建型模式、结构型模式、行为型模式
  • 创建型模式:将对象的创建与使用分割开
  • 简单工厂模式不是23种设计模式之一,属于创建型模式,可以看做一种特殊的工厂方法模式
  • 简单工厂模式通常定义一个类来专门负责创建对象,可以根据不同的参数返回不同的实例
发布了95 篇原创文章 · 获赞 25 · 访问量 4205

猜你喜欢

转载自blog.csdn.net/key_768/article/details/104471929
今日推荐