用心理解设计模式——简单工厂模式 (Simple Factory Pattern)
前置文章: 设计模式的原则 其他设计模式:用心理解设计模式专栏设计模式相关代码已统一放至 我的 Github 一、定义 创建型模式之一。 静态 工厂方法模式。二、结构解析: 它的一般结构有三种角色:抽象产品、具体产品、工厂。 抽象产品,描述了所有具体产品的公共属性; 具体产品,是工厂要创建的目标; 工厂,提供了一个“静态工厂方法”,用来创建具...
前置文章: 设计模式的原则
其他设计模式:用心理解设计模式专栏
设计模式相关代码已统一放至 我的 Github
一、定义
创建型模式之一。
静态 工厂方法模式。
二、结构解析:
它的一般结构有三种角色:抽象产品、具体产品、工厂。
抽象产品,描述了所有具体产品的公共属性;
具体产品,是工厂要创建的目标;
工厂,提供了一个“静态工厂方法”,用来创建具体产品对象。
所以通常,简单工厂模式也被称为静态工厂方法模式。
三、评价
简单工厂模式封装了产品创建过程,使用者不需要亲力制造,只需输入创建条件参数即可得到想要得到的产品对象。
简单工厂模式使产品类和使用者得以解耦。
四、实现
简单工厂模式的实质是一个根据传入的条件参数,决定应该创建哪一个产品类的静态方法。
为什么是静态方法?
因为,静态方法属于类所有,不和类对象产生联系,很容易从所在类中拆卸; 从调用的角度来说,可以免去 创建产品时先创建工厂这一步骤,避免内存分配。
using System;
//简单工厂模式,根据条件创建
namespace SimpleFactory
{
//抽象产品类
public abstract class Product { }
//具体产品类
public class ConcreteProduct1 : Product { }
public class ConcreteProduct2 : Product { }
//示例, 使用枚举作为创建参数
public enum ProductType
{
Product1,
Product2
}
//可扩展新的具体产品
//...
//工厂类
public class Factory
{
//静态工厂方法
public static Product StaticFactorMethod(ProductType productType)
{
Product product = null;
switch (productType)
{
case (ProductType.Product1):
product = new ConcreteProduct1();
break;
case (ProductType.Product2):
product = new ConcreteProduct2();
break;
//...
}
return product;
}
}
public class Client
{
private void Main()
{
//使用静态工厂方法创建具体产品1
Factory.StaticFactorMethod(ProductType.Product1);
//使用静态工厂方法创建具体产品2
Factory.StaticFactorMethod(ProductType.Product2);
}
}
}
缺点:违背开闭原则,新增产品需要修改静态工厂方法,当产品种类过多时,该创建方法会显得臃肿。
五、泛型简单工厂模式
通常,既然多个对象可以通过一个接口统一创建,那他们的构造参数一般都是一致的,要做的只是需要在创建时根据条件参数确定类型。
为了避免以上缺点,可利用泛型进行实现。
1.泛型静态工厂方法
using System;
//简单工厂模式,泛型静态工厂方法实现
namespace SimpleFactory.GenericFunction
{
//抽象产品类
public abstract class Product { }
//具体产品类
public class ConcreteProduct1 : Product { }
public class ConcreteProduct2 : Product { }
//可扩展新的具体产品
//...
//工厂类
public class Factory
{
//静态工厂方法
public static T StaticFactorMethod<T>()
{
return Activator.CreateInstance<T>();
}
}
public class Client
{
private void Main()
{
//使用静态工厂方法创建具体产品1
Factory.StaticFactorMethod<ConcreteProduct1>();
//使用静态工厂方法创建具体产品2
Factory.StaticFactorMethod<ConcreteProduct2>();
}
}
}
2.泛型工厂类
注意:为了按类型创建工厂,创建方法应作为工厂的一部分。不能使用静态。
需要将原有的静态方法改为非静态。
using System;
//简单工厂模式,泛型类实现
namespace SimpleFactory.GenericClass
{
//抽象产品类
public abstract class Product { }
//具体产品类
public class ConcreteProduct1 : Product { }
public class ConcreteProduct2 : Product { }
//可扩展新的具体产品
//...
//泛型工厂类
public class Factory<T>
{
//工厂方法
public T FactorMethod()
{
return Activator.CreateInstance<T>();
}
}
public class Client
{
private void Main()
{
new Factory<ConcreteProduct1>().FactorMethod();
new Factory<ConcreteProduct2>().FactorMethod();
}
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)