找回密码
 立即注册
首页 业界区 业界 java 抽象工厂模式

java 抽象工厂模式

杠氯 2025-6-9 08:53:26
抽象工厂模式(Abstract Factory Pattern):
  是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
  在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
  抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。
  意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
  主要解决:主要解决接口选择的问题。
  何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
  如何解决:在一个产品族里面,定义多个产品。
  关键代码:在一个工厂里聚合多个同类产品。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
注意事项:产品族难扩展,产品等级易扩展。
抽象工厂模式包含以下几个核心角色:

  • 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
  • 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
  • 抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
  • 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。
抽象工厂模式通常涉及一族相关的产品,每个具体工厂类负责创建该族中的具体产品。客户端通过使用抽象工厂接口来创建产品对象,而不需要直接使用具体产品的实现类。
===================================================================以上八股文来自 菜鸟教程,它从哪里来的不清楚 !!!!==============================================================
举个小例子:
  某个产品, 需要提供多个数据库支持(抽象工厂) ,比如 mysql 、 DB2 、Oracle 等等( 即一系列具体产品)  ,项目又被多个子公司使用  (各个子公司 就是 具体工厂),  各个子公司 有的用  mysql   有的用 DB2  或者两个都用 进行增删改查(某一具体产品)
1.png

大概就是这么个情况。。。。。
代码如下:
1. 创建 数据库服务 抽象工厂 
  1. public abstract class DBServerFactory {
  2.      public abstract MysqlServer createMysqlServer();
  3.      public abstract DB2Server createDB2Server();
  4. }
复制代码
 
2.创建 mysql  db2   是数据库 产品 接口
  1. // mysql<br>public interface MysqlServer {
  2.     public String  mysqlJdbc();
  3.     public String  mysqlSelect();
  4.     public String  mysqlSave();
  5. }
复制代码
  1. //db2
  2. public interface DB2Server {
  3.     public String  db2Jdbc();
  4.     public String  db2Select();
  5.     public String  db2Save();
  6. }
复制代码
3.创建  子公司  使用 实现
  1. //iphone 公司使用db2
  2. public class IphoneDB2 implements DB2Server {
  3.     private final String factoryName= "Iphone";
  4.     @Override
  5.     public String db2Jdbc() {
  6.         return factoryName + " db2 jdbc://xxxxxxxxxx";
  7.     }
  8.     @Override
  9.     public String db2Select() {
  10.         return factoryName + " db2 select User ==== 11";
  11.     }
  12.     @Override
  13.     public String db2Save() {
  14.         return factoryName + " db2 insert  User ==== 22";
  15.     }
  16. }
  17. //iphone 公司使用mysql
  18. public class IphoneMysql implements MysqlServer {
  19.     private final String factoryName= "iphone";
  20.     @Override
  21.     public String mysqlJdbc() {
  22.         return factoryName + " mysql jdbc://xxxxxxxxxx";
  23.     }
  24.     @Override
  25.     public String mysqlSelect() {
  26.         return factoryName + " mysql select User ==== 11";
  27.     }
  28.     @Override
  29.     public String mysqlSave() {
  30.         return factoryName + " mysql insert  User ==== 22";
  31.     }
  32. }
复制代码
  
  1. // kite 公司使用db2
  2. public class KiteDB2 implements DB2Server {
  3.     private final String factoryName= "kite";
  4.     @Override
  5.     public String db2Jdbc() {
  6.         return factoryName + " db2 jdbc://xxxxxxxxxx";
  7.     }
  8.     @Override
  9.     public String db2Select() {
  10.             return factoryName + " db2 select User ==== 11";
  11.     }
  12.     @Override
  13.     public String db2Save() {
  14.             return factoryName + " db2 insert  User ==== 22";
  15.     }
  16. }
复制代码
 4. 创建 子公司(子工厂)
  1. // iPhone 子工厂<br>public class IphoneFactory extends DBServerFactory{
  2.     @Override
  3.     public MysqlServer createMysqlServer() {
  4.         return new IphoneMysql();
  5.     }
  6.     @Override
  7.     public DB2Server createDB2Server() {
  8.         return new IphoneDB2();
  9.     }
  10. }
复制代码
 
  1. // kite(子工厂)
  2. public class KiteFactory extends DBServerFactory {
  3.     @Override
  4.     public MysqlServer createMysqlServer() {
  5.         return null;
  6.     }
  7.     @Override
  8.     public DB2Server createDB2Server() {
  9.         return new KiteDB2();
  10.     }
  11. }
复制代码
5. 使用 main 方法
  1. public static void main(String[] args) {
  2.      //iphone
  3.         DBServerFactory iphoneFactory = new IphoneFactory();<br>     //kite
  4.         DBServerFactory kiteFactory = new KiteFactory();
  5.         MysqlServer mysqlServer = iphoneFactory.createMysqlServer();
  6.         DB2Server iphoneDB2Server = iphoneFactory.createDB2Server();<br>
  7.         DB2Server kiteDB2Server = kiteFactory.createDB2Server();
  8.         System.out.println(mysqlServer.mysqlJdbc());
  9.         System.out.println(mysqlServer.mysqlSelect());
  10.         System.out.println(mysqlServer.mysqlSave());
  11.         System.out.println(kiteDB2Server.db2Jdbc());
  12.         System.out.println(kiteDB2Server.db2Select());
  13.         System.out.println(iphoneDB2Server.db2Jdbc());
  14.         System.out.println(iphoneDB2Server.db2Select());
  15.         System.out.println(iphoneDB2Server.db2Save());
  16.     }
复制代码
6.结果
2.png

 7.项目结构
3.png

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册