java模式之工厂模式

简介:

package com.mode.factory;

/**
*工厂模式,我再刚刚接触这个模式的时候很纳闷,这样不是很复杂了吗?而且有很多限制。
*其实工厂模式是用在比如数据库连接之类的地方的,生产出来的产品都是一样的,就是有个产品的父类,下面代码中我会详细解释一下每句都是干什么用的。
*
*下面的几个类提前说明一下:
*SampleFactory类:工厂类,用来创建产品,这也是这个模式的核心,所有的类都出自本类的一个方法
*Sample类:产品的抽象类,工厂中生产出来的所有产品,也就是工厂类的create方法返回的所有类都将是继承该抽象类的子类,这个类在工厂模式中也是必须的
*Sample_Box和Sample_Ball类:这就是产品了,既然是产品还可以有很多个,比如还可以写Sample_Bucket等很多的类出来,但是这些子类一定要继承Sample,并且实现父类的所有方法,工厂创建出来的产品都是统一的。
*/

public class SampleFactory{

/**
    *这个方法用来生产产品,也就是调用该方法或者一个类,这个类是继承过Sample的子类
   *@author Mars.CN
   *@param type 传入参数用来选择哪个返回哪个子类
   *@return 返回一个Sample类型的实例,Sample是个父类,由他派生出子类来
    */
public static Sample create(int type){
    if(type==1){
     return new Sample_Box();
    }else if(type==2){
     return new Sample_Ball();
    }else{
     return null;
    }
}

//当然,这里你也可以写一些其他的方法,比如带参数的之类的
}

package com.mode.factory;

/**
*产品的抽象类,所有的产品都将继承这个类
*在这个泪中所有的方法都是抽象的,等待他的子类去实现他们。
*这里看你都需要一些什么方法,如果这里没有提到的方法,那么到了子类中即使写了,工厂产生出来的产品也显示不了这些方法
*/

public abstract class Sample{
    public abstract double getPrice();//产品的单价
    public abstract String getColor();//产品的颜色
    public abstract String getIntro();//产品的介绍
}

package com.mode.factory;

/**
*实现了Sample的一个子类,也就是一个产品
*/

public class Sample_Box extends Sample{
    public double getPrice(){
     //实现该方法
     return 100;
    }
    public String getColor(){
     //实现该方法
     return "blue";
    }
    public String getIntro(){
     //实现该方法
     return "这是一个蓝色的盒子";
    }
}

package com.mode.factory;

/**
*实现了Sample的一个子类,也就是一个产品
*/

public class Sample_Ball extends Sample{
    private double price = 125;
    private String color = "yello";
    private String intro = "这是一个黄色的球";
  
    public double getPrice(){
     //实现该方法
     return price;
    }
    public String getColor(){
     //实现该方法
     return color;
    }
    public String getIntro(){
     //实现该方法
     return intro;
    }
}

package com.mode.factory;

/**
*一个测试类,将告诉你这个模式怎么使用
*/

public class Factory_Test{
    public static void main(String[] args){
     //工厂创建产品的方法是静态的,所以没必要实例化这个工厂,或者你干脆在工厂里面写一个私有的构造方法,禁止实例化工厂
     Sample sample1 = SampleFactory.create(1);//获得Sample_Box的那个子类,记住,前面接受的时候一定要用父类类型,这样才能,如果还用子类的,那工厂就没什么意义了,干脆直接new好了。
     System.out.println("工厂模式测试");
     System.out.println("-------------------------------------");
     System.out.println("介绍:" + sample1.getIntro());
     System.out.println("单价:" + sample1.getPrice());
     System.out.println("颜色:" + sample1.getColor());
     System.out.println("-------------------------------------");
     Sample sample2 = SampleFactory.create(2);//获得Sample_Ball那个子类的实例
     System.out.println("介绍:" + sample2.getIntro());
     System.out.println("单价:" + sample2.getPrice());
     System.out.println("颜色:" + sample2.getColor());
     System.out.println("-------------------------------------");
    }
}

下面再写一个工厂模式的扩展……

package com.mode.factory.daofactory.factory;
import com.mode.factory.daofactory.connection.DAOConnection;
import com.mode.factory.daofactory.exception.DAOException;
import java.sql.Connection;


/**
*工厂模式的扩展,用来创建数据库连接的东西,不同于上一个工厂模式的是,这里的产品(子类)都是靠动态加载上去的。
*/

public class DAOFactory{
   /**
    *创建一个连接,用于连接各种不同的数据库
    *@author Mars.CN
    *@param strConn 这个是子类的具体位置,比如com.mode.factory.daofactory.connection.SQLConnection
    *@return 返回一个DAOConnection类型的连接对象
    *@exception 如果提取类失败则抛出这个异常,简单写一下,明白这个意思就行了。
    */
    public static Connection getConnection(String strConn) throws DAOException{
     try{
      DAOConnection conn = (DAOConnection)Class.forName(strConn).newInstance();
      return conn.getConnection();
      //上面这个方法是动态加载一个类,并或者该类的一个实例,其实在连接数据库的时候我们也有用到。
     }catch(Exception e){
      throw new DAOException(strConn,e.getMessage());
     }
    
    }
}

package com.mode.factory.daofactory.exception;
/**
*连接异常类,意思一下,明白意思就可以了
*如果自己要写的话最好写详细点
*/

public class DAOException extends Exception{
   String strExceptionConn;
   String strErrorMessage;
  
   public DAOException(String strConn,String strMsg){
    strExceptionConn = strConn;
    strErrorMessage = strMsg;
   }
   public String toString(){
    return "类" + strExceptionConn + "未找到!\n" + strErrorMessage;
   }
  
}

package com.mode.factory.daofactory.connection;
import java.sql.*;

/**
*所有DAO连接的父类,是一个抽象类
*/

public abstract class DAOConnection{
   public abstract Connection getConnection();
}

package com.mode.factory.daofactory.connection;
import java.sql.*;

/**
*实现一个SQL的连接
*/

public class SQLConnection extends DAOConnection{
public Connection getConnection(){
   Connection conn = null;
   try{
    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
       conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=bookshop","sa", "sa");
   }catch(Exception e){
    e.printStackTrace();
   }
   return conn;
}
}

package com.mode.factory.daofactory.connection;
import java.sql.*;

/**
*实现一个Oracle的连接
*/

public class OracleConnection extends DAOConnection{
public Connection getConnection(){
   Connection conn = null;
   try{
    Class.forName("oracle.jdbc.driver.OracleDriver");
         conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:accp","scott","tiger");
   }catch(Exception e){
    e.printStackTrace();
   }
   return conn;
}
}

package com.mode.factory.daofactory;
import com.mode.factory.daofactory.factory.DAOFactory;
import com.mode.factory.daofactory.exception.DAOException;
import java.sql.Connection;

/**
*一个测试类,将告诉你这个模式怎么使用
*/

public class DAOFactory_Test{
   public static void main(String[] args){
    Connection conn;
    String dao = "com.mode.factory.daofactory.connection.SQLConnection";
    //注意,这里dao我直接写了,这里完全可以写在XML文件里,然后每次更换和配置数据库的时候直接操作XML文件,这样就不用动任何类了。
    //dao表示的就是我们获取Connection这个类的位置
    try{
     conn = DAOFactory.getConnection(dao);//用工厂的方式获得这个连接
    }catch(DAOException daoe){
     System.out.println(daoe.toString());
    }
   }
}

本文转自kenty博客园博客,原文链接http://www.cnblogs.com/kentyshang/archive/2007/08/20/862831.html如需转载请自行联系原作者


kenty

相关文章
|
3月前
|
存储 Java 大数据
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用(198)
简介:本文探讨Java大数据技术在智能家居能源消耗分析与节能策略中的应用。通过数据采集、存储与智能分析,构建能耗模型,挖掘用电模式,制定设备调度策略,实现节能目标。结合实际案例,展示Java大数据在智能家居节能中的关键作用。
|
3月前
|
Java 应用服务中间件 Docker
java-web部署模式概述
本文总结了现代 Web 开发中 Spring Boot HTTP 接口服务的常见部署模式,包括 Servlet 与 Reactive 模型、内置与外置容器、物理机 / 容器 / 云环境部署及单体与微服务架构,帮助开发者根据实际场景选择合适的方案。
122 25
|
5月前
|
供应链 JavaScript 前端开发
Java基于SaaS模式多租户ERP系统源码
ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业的运营效率和管理水平,它是一种先进的企业管理理念和信息化管理系统。 适用于小微企业的 SaaS模式多租户ERP管理系统, 采用最新的技术栈开发, 让企业简单上云。专注于小微企业的应用需求,如企业基本的进销存、询价,报价, 采购、销售、MRP生产制造、品质管理、仓库库存管理、财务应收付款, OA办公单据、CRM等。
287 23
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
109 0
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
215 11
|
JSON Java UED
uniapp:使用DCloud的uni-push推送消息通知(在线模式)java实现
以上展示了使用Java结合DCloud的uni-push进行在线消息推送的基本步骤和实现方法。实际部署时,可能需要依据实际项目的规模,业务场景及用户基数进行必要的调整和优化,确保消息推送机制在保证用户体验的同时也满足业务需求。
971 0
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
102 1
|
消息中间件 Java
【实战揭秘】如何运用Java发布-订阅模式,打造高效响应式天气预报App?
【8月更文挑战第30天】发布-订阅模式是一种消息通信模型,发送者将消息发布到公共队列,接收者自行订阅并处理。此模式降低了对象间的耦合度,使系统更灵活、可扩展。例如,在天气预报应用中,`WeatherEventPublisher` 类作为发布者收集天气数据并通知订阅者(如 `TemperatureDisplay` 和 `HumidityDisplay`),实现组件间的解耦和动态更新。这种方式适用于事件驱动的应用,提高了系统的扩展性和可维护性。
247 2
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
设计模式 XML Java
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
文章详细介绍了简单工厂模式(Simple Factory Pattern),这是一种创建型设计模式,用于根据输入参数的不同返回不同类的实例,而客户端不需要知道具体类名。文章通过图表类的实例,展示了简单工厂模式的结构、时序图、代码实现、优缺点以及适用环境,并提供了Java代码示例和扩展应用,如通过配置文件读取参数来实现对象的创建。
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)