工厂方法模式

87 阅读2分钟

定义

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使得一个类的实例化延迟到子类。



简单工厂方法

简单工厂模式,又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,把产品的生产方法封装起来放进工厂类,工厂类可以根据参数的不同返回不同产品类的实例。工厂类就是用来生产产品的类,把生产产品的方法放到工厂类里面去,工厂类里面用switch语句控制生产哪种商品,使用者只需要调用工厂类的静态方法就可以实现产品类的实例化。

优点:将对象的创建与使用进行解耦,使用者不必关心对象的具体创建过程。

缺点:不符合开闭原则,当需要添加新的实现类是改动代码较大。

class SimpleFactoryMethd {   
 public static Product getProduct(String type) {      
  if ("A".equals(type)) {           
      return new ProductA();        
   } else if ("B".equals(type)) {           
      return new ProductB();       
    } else {           
       return null;        
     }    
   }
}


工厂方法模式

优点:

用户只需要知道具体工厂方法名称就可以创建对象实例,不需要知道对象具体的创建过程。

在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

// 定义抽象产品类,将变化的类作为抽象方法,供给子类实现
interface Product{ 
  void sayName();
}
class ProductA implements Product{   
    @Override   
    public void sayName() {      
      System.out.println("This is a product");    
    }
}

class ProductB implements Product{    
  @Override    
  public void sayName() {        
    System.out.println("This is b product");   
  }
 }

// 抽象工厂
abstract class Creator{   
   abstract Product createProduct();    
   Product getObject(){       
     Product product =  createProduct();       
     return product;   
   }
}// 不同实例对应的工厂类
class ProductACreator extends Creator{    
 @Override    
 Product createProduct() {        return new ProductA();    }
}

class ProductBCreator extends Creator{  
  @Override   
  Product createProduct() {        return new ProductB();    }
}

public static void main(String[] args) throws Exception {    
   Creator creator = new ProductBCreator();    
   Product product = creator.getObject();   
   product.sayName();  
   Creator creator1 = new ProductACreator();   
   Product product1 = creator1.getObject();   
   product1.sayName();   
   Product product2 = SimpleFactoryMethd.getProduct("A");    
   product2.sayName();
}


抽象工厂方法

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

interface IConnect {    void connect();}

interface ICommand {    void command();}
// 抽象工厂方法,提供了创建相关对象的接口
interface IDatabasesUtil {   
   IConnect getConnect();    
   ICommand getCommand();
}
class MySqlConnect implements IConnect{   
  @Override    
  public void connect() {        
     System.out.println("mysql connect");   
   }
 }

class MySqlCommand implements ICommand {    
   @Override   
   public void command() {      
     System.out.println("mysql command");    
   }
 }

class MysqlDatabaseUtil implements IDatabasesUtil{    
   @Override    
   public IConnect getConnect() {       
       return new MySqlConnect();   
    }  
 
   @Override    
   public ICommand getCommand() {       
       return new MySqlCommand();    
   }
}

public static void main(String[] args) {   
    IDatabasesUtil databasesUtil = new MysqlDatabaseUtil();   
    databasesUtil.getConnect().connect();    
    databasesUtil.getCommand().command();
}

应用场景:

程序需要处理不同系列的相关产品,但是不希望依赖于这些产品的具体实现类,可以使用抽象工厂

优点:

避免具体产品和客户端代码的耦合

源码应用:

java.sql.Connection

java.sql.Driver