首页 > 其他分享 >工厂模式:一个即可简单实现,又可复杂实现的模式

工厂模式:一个即可简单实现,又可复杂实现的模式

时间:2023-05-30 12:07:54浏览次数:32  
标签:角色 实现 class 模式 工厂 即可 产品 抽象 public

工厂模式的实现主要分为三种,分别是简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)和抽象工厂模式(Abastract Factory );但是简单工厂模式不属于23种GOF设计模式之一。工厂模式在各种开源框架里使用非常普遍,例如Spring框架大量使用工程模式。下面分别介绍一下这三种实现。

0x01:  简单工厂模式

简单工厂模式也被称为静态工厂模式;简单工厂模式可以将产品的使用和生产完全分开,客户端只需要知道需要什么产品,如何来使用产品就可以了,而具体的产品生产任务由具体的工厂类来实现。工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。类图如下

工厂模式:一个即可简单实现,又可复杂实现的模式_抽象类

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。该模式中包含的角色及其职责:

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

抽象产品(IProduct)角色

public interface IFruit {
    /**
     * 种植水果方法
     */
    void plant();
}

抽象产品(IProduct)角色

//实现种植苹果
public class Apple implements IFruit {
    public void plant() {
        System.out.println("种植苹果");
    }
}

//实现种植橙子
public class Orange implements IFruit {
    public void plant() {
        System.out.println("种植橙子");
    }
}

具体产品(Concrete Product)角色

public class PlantFruitsFactory {
    public static IFruit plantFruit(String fruitType) {
        //这里使用的if判断,用switch一样的道理
        if ("Apple".equals(fruitType)){
            return new Apple();
        }else if ("Orange".equals(fruitType)){
            return new Orange();
        }else {
            return null;
        }
    }
}

测试用例

public class ClientCmd{
    public static void main(String[] args) {
        IFruit fruit = PlantFruitsFactory.plantFruit("Apple");
        fruit.plant();
        fruit = PlantFruitsFactory.plantFruit("Orange");
        fruit.plant();
    }
}

0x02: 工厂方法模式

工厂方法(Factory Method)模式的定义是一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅是负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。类图如下:

工厂模式:一个即可简单实现,又可复杂实现的模式_接口_02

  • 抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
  • 具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
  • 抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
  • 具体产品(Concrete Product)角色:该角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

抽象产品(Product)角色

//抽象产品类
public abstract class IMessage{
    //抽象产品方法
    public void send();
}

具体产品(Concrete Product)角色

//继承抽象类实现产品EmailMessage类
public class EmailMessage extends IMessage{

    //实现抽象产品方法
    @Overide
    public void send(){
        System.out.println("send Email Message~~");
    }
}

//继承抽象类实现产品SmsMessage类
public class SmsMessage extends IMessage{

    //实现抽象产品方法
    @Overide
    public void send(){
        System.out.println("send Sms Message ~~~ ");
    }
}

抽象工厂(Creator)角色

//工厂抽象类
public abstract class Factory {
    //抽象工厂方法
    public abstract IMessage createMessage();
}

具体工厂(Concrete Creator)角色

//具体工厂类EmailMessageFactory
public class EmailMessageFactory extends Factory {

    @Overide
    public IMessage createMessage() {
        System.out.println("生产了一个EmailMessage ");
        return new EmailMessage();
    }
}

//具体工厂类SmsMessageFactory
public class SmsMessageFactory extends Factory {

    @Overide
    public IMessage createMessage() {
        System.out.println("生产了一个SmsMessage");
        return new SmsMessage();
    }
}

测试用例

//调用方代码
public class ClientCmd {
    public static void main(String[] args) {
        //产生一个Email工厂
        Factory factory = new EmailMessageFactory();
        factory .createMessage().send();
        //产生一个短信工厂
        factory = new SmsMessageFactory();
        orangeFactory.createMessage().send();
    }
}

0x03: 抽象工厂模式

抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。在抽象工厂模式中,客户端不再负责对象的创建,而是把这个责任丢给了具体的工厂类,客户端只负责对对象的调用,从而明确了各个类的职责。并且当一系列相互关联的产品被设计到一个工厂类里后,客户端的调用将会变得非常简单,而且如果要更换这一系列的产品,则只需要更换一个工厂类即可。类图如下

工厂模式:一个即可简单实现,又可复杂实现的模式_抽象类_03

抽象工厂模式中存在四种角色,分别是抽象工厂角色,具体工厂角色,抽象产品角色,具体产品角色。 

  • 抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
  • 具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。 
  • 抽象产品角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
  • 具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部充满了应用系统的商业逻辑。

抽象产品角色

//抽象形状类
public abstract class Shape {
    public abstract void sayShape();
}

//抽象颜色类
public abstract class Color {
    public abstract void sayColor();
}

具体产品角色

//矩形类
public class Retangle extends Shape {

    @Overide
    public void sayShape() {
        System.out.println("Hi, I'm Retangle!");
    }
}

//圆形类
public class Circle extends Shape {

    @Overide
    public void sayShape() {
        System.out.println("Hi, I'm Circle!");
    }
}

//红色类
public class Red extends Color {
    @Overide
    public void sayColor() {
        System.out.println("Hi, I'm Red!");
    }
}

//白色类
public class White extends Color {
    @Overide
    public void sayColor() {
        System.out.println("Hi, I'm White!");
    }
}

抽象工厂角色

//抽象工厂类
public abstract class ShapeFactory {

    public abstract Shape createShape();

    public abstract Color createColor();
}

具体工厂角色

//红色的圆
public class RedCircleFactory extends ShapeFactory {

    @Overide
    public Shape createShape() {
        return new Circle();
    }

    @Overide
    public Color createColor() {
        return new Red();
    }
}

//白色的圆
public class WhiteCircleFactory extends ShapeFactory {

    @Overide
    public Shape createShape() {
        return new Circle();
    }

    @Overide
    public Color createColor() {
        return new White();
    }
}

测试用例 

public class ClientCmd {  
    public static void main(String[] args){  
        //红色的圆
        ShapeFactory factory = new RedCircleFactory();  
        factory.createShape().sayShape();  
        factory.createColor().sayShapeColor();  
        //白色的圆
        ShapeFactory factory = new WhiteCircleFactory();  
        factory.createShape().sayShape();  
        factory.createColor().sayShapeColor();  
    }  
}


Java乐园

工厂模式:一个即可简单实现,又可复杂实现的模式_抽象类_04

工厂模式:一个即可简单实现,又可复杂实现的模式_接口_05

标签:角色,实现,class,模式,工厂,即可,产品,抽象,public
From: https://blog.51cto.com/u_13538361/6377671

相关文章

  • 单例模式简单复杂,线程不安全到安全
    0x01:简介说到单例模式,可以说单例模式是最常见,也是最常用的设计模式了。Spring的bean默认就是单例的。虽然单例模式是最简单的设计模式,但是在实现上有多种方式,分别是饿汉式、懒汉式、双重校验锁;在线程安全方面有线程不安全的,也有线程相对安全的。总的来说实现单例模式有以下一些特......
  • 模板模式:一种体现多态的设计模式
    0x01:模板模式模板模式(Template),又叫模板方法模式(TemplateMethod),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方法实现,但调用将以抽象类中定义的方式进行。模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,......
  • 被用到炉火纯清的迭代器模式
    0x01:迭代器模式简介Java中可以说已经把迭代器模式用到了极致,每一个集合类都关联了一个迭代器类Iterator。迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。UML类图如下:其中,Aggregate是聚集抽象类,负责提供创建具体迭代器角色的接口;Iter......
  • 傀儡政权之代理模式
    代理模式应用非常广泛,特别java领域的Spring框架,可以说把代理模式运用到极致。其中Spring的代理又分JDK动态代理和cglib动态代理。这类不打算深入讲解Spring的动态代理,而是深入讲解一下GOF23的代理模式。0x01:代理模式代理模式:给某一个对象提供一个代理对象,并由代理对象控制对原对象......
  • 如何用ReadWriteLock实现一个通用的缓存中心?
    摘要:在并发场景中,JavaSDK中提供了ReadWriteLock来满足读多写少的场景。本文分享自华为云社区《【高并发】基于ReadWriteLock开了个一款高性能缓存》,作者:冰河。写在前面在实际工作中,有一种非常普遍的并发场景:那就是读多写少的场景。在这种场景下,为了优化程序的性能,我们经常使用缓......
  • 实现延迟队列
    原理:利用消息过期后消息进入死信,然后消费者订阅死信队列进行消费达到延迟的功能 生产者-->交换机01-->过期队列-->消息过期后-->死信交换机-->死行队列-->消费者 定义配置@ConfigurationpublicclassTTLQueueConfig{//region声明普通类型的交换机和队列pu......
  • C# 代码实现关机
    AdvApi32.LookupPrivilegeValue(null,"SeShutdownPrivilege",outvarlpLuid);usingvart=AdvApi32.SafeHTOKEN.FromThread(Kernel32.SafeHTHREAD.Current,AdvApi32.TokenAccess.TOKEN_ADJUST_PRIVILEGES|AdvApi32.TokenAccess.TOKEN_QUERY);varptp=......
  • 界面组件Telerik UI for WPF可轻松实现直方图,让数据可视化更简单
    TelerikUIforWPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UIforWPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成VisualStudio工具箱中。TelerikUIforWPF|下载试用TelerikUI......
  • Java实现打包压缩文件或文件夹生成zip以实现多文件批量下载
    有时候在系统中需要一次性下载多个文件,但逐个下载文件比较麻烦。这时候,最好的解决办法是将所有文件打包成一个压缩文件,然后下载这个压缩文件,这样就可以一次性获取所有所需的文件了。下面是一个名为CompressUtil的工具类的代码,它提供了一些方法来处理文件压缩和下载操作:importor......
  • 文档在线预览(二)word、pdf文件转html以实现文档在线预览
    @目录一、将文件转换成html字符串1、将word文件转成html字符串2、将pdf文件转成html字符串二、将文件转换成html,并生成html文件FileUtils类将html字符串生成html文件示例:1、将word文件转换成html文件2、将pdf文件转换成html文件实现文档在线预览的方式除了上篇文章《文档在线预览......