首页 > 编程语言 >java 抽象工厂模式

java 抽象工厂模式

时间:2024-04-13 19:33:42浏览次数:26  
标签:return String factoryName 工厂 抽象 Override java public

抽象工厂模式(Abstract Factory Pattern):

  是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

  在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

  抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。

  意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

  主要解决:主要解决接口选择的问题。

  何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

  如何解决:在一个产品族里面,定义多个产品。

  关键代码:在一个工厂里聚合多个同类产品。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

注意事项:产品族难扩展,产品等级易扩展。

抽象工厂模式包含以下几个核心角色:

  • 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
  • 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
  • 抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
  • 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。

抽象工厂模式通常涉及一族相关的产品,每个具体工厂类负责创建该族中的具体产品。客户端通过使用抽象工厂接口来创建产品对象,而不需要直接使用具体产品的实现类。

===================================================================以上八股文来自 菜鸟教程,它从哪里来的不清楚 !!!!==============================================================

举个小例子:

  某个产品, 需要提供多个数据库支持(抽象工厂) ,比如 mysql 、 DB2 、Oracle 等等( 即一系列具体产品)  ,项目又被多个子公司使用  (各个子公司 就是 具体工厂),  各个子公司 有的用  mysql   有的用 DB2  或者两个都用 进行增删改查(某一具体产品)

大概就是这么个情况。。。。。

代码如下:

1. 创建 数据库服务 抽象工厂 

public abstract class DBServerFactory {

     public abstract MysqlServer createMysqlServer();

     public abstract DB2Server createDB2Server();
}

 

2.创建 mysql  db2   是数据库 产品 接口

// mysql
public interface MysqlServer { public String mysqlJdbc(); public String mysqlSelect(); public String mysqlSave(); }
//db2
public interface DB2Server {
    public String  db2Jdbc();
    public String  db2Select();
    public String  db2Save();
}

3.创建  子公司  使用 实现

//iphone 公司使用db2
public class IphoneDB2 implements DB2Server {
    private final String factoryName= "Iphone";

    @Override
    public String db2Jdbc() {
        return factoryName + " db2 jdbc://xxxxxxxxxx";
    }

    @Override
    public String db2Select() {
        return factoryName + " db2 select User ==== 11";
    }

    @Override
    public String db2Save() {
        return factoryName + " db2 insert  User ==== 22";
    }
}

//iphone 公司使用mysql

public class IphoneMysql implements MysqlServer {

    private final String factoryName= "iphone";

    @Override
    public String mysqlJdbc() {
        return factoryName + " mysql jdbc://xxxxxxxxxx";
    }

    @Override
    public String mysqlSelect() {
        return factoryName + " mysql select User ==== 11";
    }

    @Override
    public String mysqlSave() {
        return factoryName + " mysql insert  User ==== 22";
    }
}

  

// kite 公司使用db2
public class KiteDB2 implements DB2Server {

    private final String factoryName= "kite";

    @Override
    public String db2Jdbc() {
        return factoryName + " db2 jdbc://xxxxxxxxxx";
    }

    @Override
    public String db2Select() {
            return factoryName + " db2 select User ==== 11";
    }

    @Override
    public String db2Save() {
            return factoryName + " db2 insert  User ==== 22";
    }
}

 4. 创建 子公司(子工厂)

// iPhone 子工厂
public class IphoneFactory extends DBServerFactory{ @Override public MysqlServer createMysqlServer() { return new IphoneMysql(); } @Override public DB2Server createDB2Server() { return new IphoneDB2(); } }

 

// kite(子工厂)
public class KiteFactory extends DBServerFactory {
    @Override
    public MysqlServer createMysqlServer() {
        return null;
    }

    @Override
    public DB2Server createDB2Server() {
        return new KiteDB2();
    }
}

5. 使用 main 方法

 public static void main(String[] args) {
     //iphone
        DBServerFactory iphoneFactory = new IphoneFactory();
     //kite DBServerFactory kiteFactory = new KiteFactory(); MysqlServer mysqlServer = iphoneFactory.createMysqlServer(); DB2Server iphoneDB2Server = iphoneFactory.createDB2Server();
DB2Server kiteDB2Server = kiteFactory.createDB2Server(); System.out.println(mysqlServer.mysqlJdbc()); System.out.println(mysqlServer.mysqlSelect()); System.out.println(mysqlServer.mysqlSave()); System.out.println(kiteDB2Server.db2Jdbc()); System.out.println(kiteDB2Server.db2Select()); System.out.println(iphoneDB2Server.db2Jdbc()); System.out.println(iphoneDB2Server.db2Select()); System.out.println(iphoneDB2Server.db2Save()); }

6.结果

 7.项目结构

 

==========================================收工=================================================================================

 

标签:return,String,factoryName,工厂,抽象,Override,java,public
From: https://www.cnblogs.com/zy115/p/18133189

相关文章

  • [Java SE] 经典问题:超出Java Long型(8字节/64位)的二进制比特流数据如何进行大数的数
    0问题描述经典问题:超出JavaLong型(8字节/64位)的二进制比特流数据如何进行大数的数值计算?近期工作上遇到了这个问题:需要将一个无符号数、且位长>=8字节(等于8字节时,首位bit为1,其他bit不全为0)的二进制字符串转为Java****对象(原始整数),进行整型运算、或浮点数运算浮点运算......
  • Java中的各种引用类型以及部分引用的相关例子
    在Java中,引用类型主要有四种,分别是:强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。这些类型通常与垃圾回收机制有关,用来描述对象的生命周期和可达性。下面详细介绍每一种引用类型:强引用(StrongReference)强引用是最常见的引用......
  • 记录协助Javaer硬件快速开发过程之Web技术栈对接施耐德网络IO网关
    前一段时间有个Java技术栈的朋友联系到我,需要快速对接现有的无人值守称重系统,这里的对接是指替代现有系统,而非软件层面的对接,也就是利用现有的硬件开发一套替代现有软件的自动化系统。主要设备包括地磅秤、道闸、红外对射传感器、摄像头、小票打印、LED显示屏等等,全程使用LED显示......
  • java的两个bean之间复制属性,所有属性中替换某几个字符
    以下是实现代码:importjava.beans.PropertyDescriptor;importjava.lang.reflect.InvocationTargetException;importjava.util.ArrayList;importjava.util.List;importorg.springframework.beans.BeanUtils;publicclassBeanCopyUtil{/***复制bean属性......
  • 在Windows安装javaSE8
    1.下载安装官网Java1.8_31.zip2.配置环境变量创建.bat文件,写入以下内容后执行。自动配置环境变量@echooff%1mshtavbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c%~s0::","","runas",1)(window.close)&&exit......
  • JAVA 板子
    代码片段1importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;importjava.io.PrintWriter;importjava.io.StreamTokenizer;publicclassMain{stati......
  • java代码审计-sqli
    Java代码审计-sqli0x01漏洞挖掘jdbc在上古时期,人们往往这么从数据库获取数据。publicUsergetUserById(Stringid)throwsSQLException{Connectionconnection=JDBCTOOLS.getConnection(); Stringsql="selectid,usernamefromuserwhereid="+id; State......
  • java代码审计-反序列化
    Java代码审计-反序列化0x00漏洞挖掘业务代码简单来说,找readObject/readUnshared就好了protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{StringbaseStr=request.getParameter("str");b......
  • Java基础知识篇02——封装
    大家好,我是白夜,今天给大家聊聊面向对象的三大特征——封装一、包(package)1.1、包的引入先来看看我们之前写的代码结构以上代码存在的问题所有类写在一个目录下面,非常难管理,因为以后项目不可能只有这么几个类,当类数量很大的时候,就不容易管理了。不能写同名但是不同需求的类......
  • Java如何自行实现正向地理编码算法(不依赖api,不联网)
    政务场景中经常会遇到地址落图,或者三维挂接的场景。如何将文本地址转化为gps坐标是实现要解决的核心问题。addresstool为正向地理编码提供了非常简单、高效的算法。如何实现正向地理编码,只需要3步就行:第一步:带有坐标的标准地址加载到addresstool中。第二部:以业务地址作为参数,使......