简单工厂模式
简单工厂模式并不属于GoF的23种经典设计模式,但通常将它作为学习其他工厂模式的基础。
下面我们通过一个类图来简单的认识一下简单工厂模式
代码实现
Product
public interface Product
{
void sayName();
}
ProductA
class ProductA : Product
{
public void sayName()
{
Console.WriteLine("我是A");
}
}
ProductB
class ProductB : Product
{
public void sayName()
{
Console.WriteLine("我是B");
}
}
ProductFactory
public class ProductFactory
{
public static Product getProductFactory(string name)
{
switch (name)
{
case "A": {
return new ProductA();
} break;
case "B": {
return new ProductB();
} break;
default:
{
return null;
}break;
}
}
}
使用方法
Product a = ProductFactory.getProductFactory("A");
a.sayName();
效果
过程解析
从上面的类图和代码可以看出,在简单工厂模式中,我们可以抽取出三类角色:
抽象产品接口
产品的实体类
产品工厂类
抽象产品接口(Product):将产品的共同特征抽象出来的一个接口,作为工厂类的创建方法的返回值,同时,各个产品实体类同样需要实现这个接口;
产品实体类(ProductA):具体的产品实体类,是工厂的创建目标;
产品工厂类(ProductFactory): 简单工厂模式的核心,负责实现创建实体类的具体业务逻辑,由外部调用创建所需要的实体类对象。
简单工厂模式的适用环境
工厂类负责创建的对象较少
外部(客户端)只需要知道需要传入的参数,并不需要关心如何创建该对象
工厂方法模式
工厂方法模式是简单工厂模式的延伸,下面,我们同样通过一个类图来先了解一下工厂方法模式
代码实现
Product
public interface Product
{
void sayName();
}
ProductA
class ProductA : Product
{
public void sayName()
{
Console.WriteLine("我是A");
}
}
ProductB
class ProductB : Product
{
public void sayName()
{
Console.WriteLine("我是B");
}
}
Factory
public interface Factory
{
Product getProduct();
}
ProductFactoryA
class ProductFactoryA : Factory
{
public Product getProduct()
{
return new ProductA();
}
}
ProductFactoryB
class ProductFactoryB : Factory
{
public Product getProduct()
{
return new ProductB();
}
}
调用
Factory a = new ProductFactoryA();
Product product = a.getProduct();
product.sayName();
效果
过程解析
工厂方法模式相较于简单工厂模式而言,从代码量上看似乎更为复杂,但在下面这样的情况中,工厂方法模式会更具优势:
如果在现有A,B两种产品的情况下,需要增加C这个产品
那么在简单工厂模式下,我们不仅需要增加一个产品类,还需要修改工厂类中getProduct方法的业务逻辑,那么这样的修改就会动到我们的源代码;
如果使用工厂方法模式的话,就只需要增加一个产品类和工厂类就可以完成原功能的升级,不需要修改我们原本已经写好的源代码,这样更利于程序的维护。
同样是相当于简单工厂模式来进行分析,工厂方法模式多出了一个角色:
适用环境
客户端(调用者)不知道他所需要的对象的类
抽象工厂类通过其子类来指定创建那个对象
最后说几句
这次教程中主要介绍了两种设计模式(简单工厂模式和工厂方法模式),通过这两种模式,大家应该可以看出设计模式的优点。虽说在使用设计模式是有可能会增加程序的代码量,但在维护和升级上而言,使用设计模式会更优。
閱讀更多 騎著豬豬的CodeMonkey 的文章