您好,登录后才能下订单哦!
工厂方法模式(Factory Method Pattern)是一种常用的设计模式,属于创建型模式。它提供了一种创建对象的方式,而无需指定具体的类。工厂方法模式通过定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。这使得类的实例化过程延迟到子类。
工厂方法模式的核心思想是将对象的创建过程与使用过程分离。通过定义一个工厂接口,具体的产品类由具体的工厂类来创建。这样,客户端代码只需要依赖于工厂接口,而不需要知道具体的产品类。
工厂方法模式主要由以下几个角色组成:
classDiagram
class Product {
<<interface>>
+use() void
}
class ConcreteProductA {
+use() void
}
class ConcreteProductB {
+use() void
}
class Creator {
<<interface>>
+factoryMethod() Product
}
class ConcreteCreatorA {
+factoryMethod() Product
}
class ConcreteCreatorB {
+factoryMethod() Product
}
Product <|.. ConcreteProductA
Product <|.. ConcreteProductB
Creator <|.. ConcreteCreatorA
Creator <|.. ConcreteCreatorB
ConcreteCreatorA --> ConcreteProductA
ConcreteCreatorB --> ConcreteProductB
// 抽象产品
interface Product {
void use();
}
// 具体产品A
class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("Using ConcreteProductA");
}
}
// 具体产品B
class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("Using ConcreteProductB");
}
}
// 抽象工厂
interface Creator {
Product factoryMethod();
}
// 具体工厂A
class ConcreteCreatorA implements Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductA();
}
}
// 具体工厂B
class ConcreteCreatorB implements Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductB();
}
}
// 客户端代码
public class FactoryMethodPatternDemo {
public static void main(String[] args) {
Creator creatorA = new ConcreteCreatorA();
Product productA = creatorA.factoryMethod();
productA.use();
Creator creatorB = new ConcreteCreatorB();
Product productB = creatorB.factoryMethod();
productB.use();
}
}
use()
方法,所有具体产品类都需要实现这个方法。Product
接口,并提供了具体的use()
方法实现。factoryMethod()
方法,返回一个Product
类型的对象。Creator
接口,并提供了具体的factoryMethod()
方法实现,返回对应的具体产品对象。factoryMethod()
方法,获取具体的产品对象,并调用其use()
方法。工厂方法模式适用于以下场景:
工厂方法模式在实际应用中,可以根据具体需求进行一些变体,常见的变体包括:
简单工厂模式是工厂方法模式的一种简化形式,它将工厂方法模式中的抽象工厂和具体工厂合并为一个工厂类,通过参数来决定创建哪种产品。
// 简单工厂类
class SimpleFactory {
public static Product createProduct(String type) {
if ("A".equals(type)) {
return new ConcreteProductA();
} else if ("B".equals(type)) {
return new ConcreteProductB();
} else {
throw new IllegalArgumentException("Unknown product type");
}
}
}
// 客户端代码
public class SimpleFactoryDemo {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.use();
Product productB = SimpleFactory.createProduct("B");
productB.use();
}
}
静态工厂方法是将工厂方法定义为静态方法,直接通过类名调用,而不需要创建工厂类的实例。
// 静态工厂类
class StaticFactory {
public static Product createProductA() {
return new ConcreteProductA();
}
public static Product createProductB() {
return new ConcreteProductB();
}
}
// 客户端代码
public class StaticFactoryDemo {
public static void main(String[] args) {
Product productA = StaticFactory.createProductA();
productA.use();
Product productB = StaticFactory.createProductB();
productB.use();
}
}
多工厂方法是在一个工厂类中定义多个工厂方法,分别创建不同的产品。
// 多工厂类
class MultiFactory {
public Product createProductA() {
return new ConcreteProductA();
}
public Product createProductB() {
return new ConcreteProductB();
}
}
// 客户端代码
public class MultiFactoryDemo {
public static void main(String[] args) {
MultiFactory factory = new MultiFactory();
Product productA = factory.createProductA();
productA.use();
Product productB = factory.createProductB();
productB.use();
}
}
工厂方法模式是一种常用的设计模式,适用于对象的创建过程复杂、需要扩展产品类、需要解耦的场景。通过将对象的创建过程与使用过程分离,工厂方法模式提高了系统的灵活性和可维护性。在实际应用中,可以根据具体需求选择不同的变体,如简单工厂模式、静态工厂方法、多工厂方法等。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。