
工厂模式属于创建型设计模式,它用于解耦对象的创建和使用。通常情况下,我们创建对象时需要使用new操作符,但是使用new操作符创建对象会使代码具有耦合性。工厂模式通过提供一个公共的接口,使得我们可以在不暴露对象创建逻辑的情况下创建对象。
工厂模式主要分为三种类型:
简单工厂模式是一种创建型设计模式,它提供了一个静态方法(或其他静态机制)来封装对象的创建过程,客户端只需要传入相应的参数,就可以获取到所需要的对象实例,而无需关心具体的创建细节。
// 产品接口
interface Shape {
void draw();
}
// 具体产品类 Circle
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
// 具体产品类 Rectangle
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
// 工厂类
class ShapeFactory {
// 使用静态方法创建对象
public static Shape getShape(String shapeType) {
if ("CIRCLE".equalsIgnoreCase(shapeType)) {
return new Circle();
} else if ("RECTANGLE".equalsIgnoreCase(shapeType)) {
return new Rectangle();
}
return null;
}
}
// 客户端代码
public class FactoryPatternDemo {
public static void main(String[] args) {
Shape shape1 = ShapeFactory.getShape("CIRCLE");
shape1.draw();
Shape shape2 = ShapeFactory.getShape("RECTANGLE");
shape2.draw();
}
}定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
// 产品接口
interface Product {
void use();
}
// 具体产品类A
class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("Using product A.");
}
}
// 具体产品类B
class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("Using product B.");
}
}
// 抽象工厂类
abstract class Creator {
public abstract Product factoryMethod();
}
// 具体工厂类A
class ConcreteCreatorA extends Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductA();
}
}
// 具体工厂类B
class ConcreteCreatorB extends Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductB();
}
}
// 客户端代码
public class FactoryMethodDemo {
public static void main(String[] args) {
Creator creatorA = new ConcreteCreatorA();
Product productA = creatorA.factoryMethod();
productA.use(); // 输出 "Using product A."
Creator creatorB = new ConcreteCreatorB();
Product productB = creatorB.factoryMethod();
productB.use(); // 输出 "Using product B."
}
}抽象工厂模式是一种为访问一系列相互关联或相互依赖的对象提供一个接口,而无需指定它们具体的类。在抽象工厂模式中,有一个抽象工厂接口定义了创建产品对象的操作接口,但由子类来决定实例化哪一个类。客户端则针对抽象工厂接口编程,不依赖于具体的工厂实现。
易于交换产品系列,由于一个具体的工厂类只在一个产品族中创建产品对象,使得将一个产品族替换成另一个产品族变得容易,它只需要改变具体的
工厂类即可。 2. 有利于产品的一致性,当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。 3. 提高系统的可扩展性,增加新的产品族很方便,无需修改已有的系统,符合开闭原则。
// 产品接口A
interface ProductA {
void use();
}
// 产品接口B
interface ProductB {
void assemble();
}
// 产品A的实现类1
class ConcreteProductA1 implements ProductA {
@Override
public void use() {
System.out.println("Using product A1.");
}
}
// 产品A的实现类2
class ConcreteProductA2 implements ProductA {
@Override
public void use() {
System.out.println("Using product A2.");
}
}
// 产品B的实现类1
class ConcreteProductB1 implements ProductB {
@Override
public void assemble() {
System.out.println("Assembling product B1.");
}
}
// 产品B的实现类2
class ConcreteProductB2 implements ProductB {
@Override
public void assemble() {
System.out.println("Assembling product B2.");
}
}
// 抽象工厂接口
interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
// 具体工厂类1
class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
// 具体工厂类2
class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
AbstractFactory factory1 = new ConcreteFactory1();
ProductA productA1 = factory1.createProductA();
ProductB productB1 = factory1.createProductB();
productA1.use();
productB1.assemble();
AbstractFactory factory2 = new ConcreteFactory2();
ProductA productA2 = factory2.createProductA();
ProductB productB2 = factory2.createProductB();
productA2.use();
productB2.assemble();
}
}工厂方法模式与抽象工厂模式的区别在于:
工厂模式提供了一种创建对象的机制,使得对象的创建和使用分离,提高了代码的可维护性和可扩展性。在实际开发中,根据具体需求选择合适的工厂模式,可以有效地简化对象创建过程,降低系统复杂度。