目录
概述
工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但是让子类来决定实例化哪个类。工厂方法模式使一个类的实例化延迟到其子类。这种模式提供了一种创建对象的最佳方式,而无需暴露对象的创建逻辑。它通过将对象的实例化委托给子类来解耦客户端代码与具体的对象创建过程。
工厂方法模式的核心是一个抽象工厂类,它包含一个用于创建对象的抽象工厂方法。具体的工厂类继承自抽象工厂类,并实现工厂方法以创建具有特定行为的对象。客户端代码只需要调用抽象工厂类的方法即可,无需关心具体的对象类型和创建过程。
优点
工厂方法模式的优点在于它将对象的创建过程封装起来,并且通过使用抽象工厂类和具体工厂类的组合来实现对象类型的扩展。客户端代码只需要调用抽象工厂类的方法,而无需关心具体的对象类型和创建过程。这样可以提高代码的可维护性和可扩展性。
缺点
工厂方法模式的缺点在于它会增加代码的复杂度,因为需要定义抽象工厂类和具体工厂类。此外,由于每个具体工厂类只能创建一种对象类型,因此当需要创建多种对象类型时,需要定义多个具体工厂类,这可能会导致类的个数过多。
UML类图
工厂方法模式UML类图:
在上图中,Product是抽象产品类,ConcreteProduct是具体产品类,它实现了Product接口并定义了具体的行为。
Creator是抽象工厂类,它包含一个工厂方法用于创建具体的产品对象。ConcreteCreator是具体工厂类,它实现了Creator接口并实现了工厂方法,用于创建具体的产品对象。
客户端通过调用具体工厂类的工厂方法来创建具体的产品对象,从而实现了对象的创建与使用的分离
示例代码
下面是一个使用C#语言实现工厂方法模式的示例代码:首先,我们定义一个抽象类Animal和两个派生类Dog和Cat。
public abstract class Animal
{
public abstract void Speak();
}
public class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("汪汪!");
}
}
public class Cat : Animal
{
public override void Speak()
{
Console.WriteLine("喵喵!");
}
}
然后,我们定义一个抽象工厂类AnimalFactory,它包含一个抽象工厂方法CreateAnimal,用于创建Animal对象。
public abstract class AnimalFactory
{
public abstract Animal CreateAnimal();
}
接着,我们定义两个具体工厂类DogFactory和CatFactory,它们分别继承自AnimalFactory,并实现CreateAnimal方法以创建Dog和Cat对象。
public class DogFactory : AnimalFactory
{
public override Animal CreateAnimal()
{
return new Dog();
}
}
public class CatFactory : AnimalFactory
{
public override Animal CreateAnimal()
{
return new Cat();
}
}
最后,我们可以在客户端代码中使用具体工厂类来创建对象并调用它们的方法:
AnimalFactory factory = new DogFactory();
Animal dog = factory.CreateAnimal();
dog.Speak(); // 输出:"汪汪!"
factory = new CatFactory();
Animal cat = factory.CreateAnimal();
cat.Speak(); // 输出:"喵喵!"
在这个例子中,AnimalFactory是抽象工厂类,它声明了一个抽象方法CreateAnimal,用于创建Animal对象。DogFactory和CatFactory是具体工厂类,它们分别继承自AnimalFactory,并实现了CreateAnimal方法以创建Dog和Cat对象。客户端代码只需要调用具体工厂类的CreateAnimal方法即可,无需关心具体的对象类型和创建过程。这样可以避免客户端直接依赖于具体的Animal实现类,从而提高代码的可维护性和可扩展性。