定义
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。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