一、普通工厂模式
1.1、模式定义:
定义一个用于创建对象的接口,让子类决定去实例化哪一个类:其中的抽象工厂方法(factoryMethod),就是使得一个类的实例化延迟到了子类。
1.2、应用场景
①、当使用者不知道要创建的对象的确切类型时候;
②、当使用者希望为库或者框架提供扩展其内部组件的方法时;
1.3、优点
将具体要创建的对象和创建者解耦:
①、符合单一职责原则
②、符合开闭原则
1.4、一般工厂模式的实现方式
public class FactoryPattern {
public static void main(String[] args) {
Sender s = producer("mail");
s.send();
}
public static Sender producer(String str){
if ("mail".equals(str)){
return new MailSender();
}else if("sms".equals(str)){
return new SmsSender();
}else{
System.out.println("传入参数有误");
return null;
}
}
}
interface Sender {
void send();
}
class MailSender implements Sender {
public void send() {
System.out.println("this is a MailSend");
}
}
class SmsSender implements Sender {
public void send() {
System.out.println("this is a SmsSender");
}
}
上面代码的运行结果如下:
1.5、源码中的应用
Tomcat源码中的TomcatURLStreamHandlerFactory.class,该类继承jdk源码URLStreamHandlerFactory.interface接口,如下所示:
二、抽象工厂模式
2.1、模式定义
提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类
2.2、用途
①、只定义了产品和创建产品之间的关系,无需担心要具体要创建什么类型的产品;
②、程序只希望依赖产品的接口,而不希望依赖具体的实现类。
2.3、优点
①、符合单一职责原则
②、符合开闭原则
2.4、抽象工厂模式的实现方式
package factory;
public class AbstractFactory {
public static void main(String[] args) {
//此处具体使用创建哪个产品的实例,就会创造出来哪个产品的实例
//IDataBaseUtils相当于抽象工厂,而OracleDataBaseUtils,MysqlDataBaseUtils则是实际创建的工厂
IDataBaseUtils oracleBaseUtils = new OracleDataBaseUtils();
IConnection oracleConnection = oracleBaseUtils.getConnection();
ICommand oracleCommand = oracleBaseUtils.getCommand();
IDataBaseUtils mysqlBaseUtils = new MysqlDataBaseUtils();
IConnection mysqlConnection = mysqlBaseUtils.getConnection();
ICommand mysqlCommand = mysqlBaseUtils.getCommand();
System.out.println("oracle具体工厂创建的实例:"+oracleConnection+".........."+oracleCommand);
System.out.println("mysql具体工厂创建的实例:"+mysqlConnection+".........."+mysqlCommand);
}
}
interface IConnection{
void connect();
}
interface ICommand{
void sendCommand();
}
interface IDataBaseUtils{
IConnection getConnection();
ICommand getCommand();
}
class MysqlConnection implements IConnection{
@Override
public void connect() {
System.out.println("MySql connect....");
}
}
class OracleConnection implements IConnection{
@Override
public void connect() {
System.out.println("Oracle connect....");
}
}
class MysqlCommand implements ICommand{
@Override
public void sendCommand() {
System.out.println("MySql send command");
}
}
class OracleCommand implements ICommand{
@Override
public void sendCommand() {
System.out.println("Oracle send command");
}
}
class MysqlDataBaseUtils implements IDataBaseUtils{
@Override
public IConnection getConnection() {
return new MysqlConnection();
}
@Override
public ICommand getCommand() {
return new MysqlCommand();
}
}
class OracleDataBaseUtils implements IDataBaseUtils{
@Override
public IConnection getConnection() {
return new OracleConnection();
}
@Override
public ICommand getCommand() {
return new OracleCommand();
}
}
上面代码的运行结果如下: