在Java中,工厂模式可以通过两种方式来实现:简单工厂模式和抽象工厂模式。
简单工厂模式: 简单工厂模式的核心是定义一个工厂类,该类负责创建其他类的实例。具体步骤如下:
- 创建一个抽象产品类,该类定义了产品的共同属性和方法。
- 创建具体产品类,继承抽象产品类,并实现其方法。
- 创建一个工厂类,该类负责根据传入的参数来创建具体产品类的实例。
- 在工厂类中定义一个静态方法,用于创建产品实例。
- 在客户端中,通过调用工厂类的静态方法来获取产品实例。
示例代码如下:
// 抽象产品类 public abstract class Product { public abstract void use(); } // 具体产品类A public class ConcreteProductA extends Product { @Override public void use() { System.out.println("使用具体产品A"); } } // 具体产品类B public class ConcreteProductB extends Product { @Override public void use() { System.out.println("使用具体产品B"); } } // 工厂类 public class Factory { public static Product createProduct(String type) { if (type.equals("A")) { return new ConcreteProductA(); } else if (type.equals("B")) { return new ConcreteProductB(); } return null; } } // 客户端 public class Client { public static void main(String[] args) { Product productA = Factory.createProduct("A"); productA.use(); // 使用具体产品A Product productB = Factory.createProduct("B"); productB.use(); // 使用具体产品B } }
抽象工厂模式: 抽象工厂模式将具体产品的创建推迟到了具体工厂类中,通过定义工厂接口和产品接口来实现。具体步骤如下:
- 创建抽象产品接口,定义产品的共同属性和方法。
- 创建具体产品类,实现抽象产品接口。
- 创建抽象工厂接口,定义根据具体产品类创建产品的方法。
- 创建具体工厂类,实现抽象工厂接口,并实现创建具体产品的方法。
- 在客户端中,通过具体工厂类来创建具体产品实例。
示例代码如下:
// 抽象产品接口 public interface Product { void use(); } // 具体产品类A public class ConcreteProductA implements Product { @Override public void use() { System.out.println("使用具体产品A"); } } // 具体产品类B public class ConcreteProductB implements Product { @Override public void use() { System.out.println("使用具体产品B"); } } // 抽象工厂接口 public interface Factory { Product createProduct(); } // 具体工厂类A public class ConcreteFactoryA implements Factory { @Override public Product createProduct() { return new ConcreteProductA(); } } // 具体工厂类B public class ConcreteFactoryB implements Factory { @Override public Product createProduct() { return new ConcreteProductB(); } } // 客户端 public class Client { public static void main(String[] args) { Factory factoryA = new ConcreteFactoryA(); Product productA = factoryA.createProduct(); productA.use(); // 使用具体产品A Factory factoryB = new ConcreteFactoryB(); Product productB = factoryB.createProduct(); productB.use(); // 使用具体产品B } }
这样,通过工厂模式,可以将对象的创建和使用解耦,使得客户端不需要关心具体产品的创建细节,只需要使用工厂类来获取产品实例。