简单工厂模式(Simple Factory)
创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无需关心对象的创建细节。
在简单工厂模式,只需记住一个简单的参数即可获得所需的对象实例
简单工厂模式包含以下3个角色:
1.Factory(工厂角色):负责实现创建所有产品实例的内部逻辑。
2.Product(抽象产品角色):它是工厂类所创建所有对象的父类。
3.ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标。
抽象产品类:
abstract class Product
{
//所有产品类的公共业务方法
public void MethodSame()
{
//公共方法实现
}
//声明抽象业务方法
public abstract void MethodDiff();
}
具体产品类:
class ConcreteProductA : Product
{
//实现业务方法
public override void MethodDiff(){
//业务方法的实现
}
}
工厂类:
class Factory
{
//静态工厂方法
public static Product GetProduct(string arg){
Product product = null;
if(arg.Equals("A"))
product = new ConcreteProductA(); //初始化设置product
else if(arg.Equals("B"))
product = new ConcretProcuttB(); //初始化设置product
return product;
}
}
客户端代码:
class Program
{
static void Main(string[] args)
{
Product product;
product = Factory.GetProduct("A"); //通过工厂类创建产品对象
product.MethodSame();
product.MethodDiff();
}
}
工厂方法模式(Factory Method Pattern)
在工厂方法模式,定义一个用于创建对象的接口,但是让子类决定子类将哪一个类实例化,工厂方法模式让一个类的实例化延迟到其子类中
工厂方法模式,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂类
工厂方法模式包含以下4个角色:
1.Factory(抽象工厂角色):所有创建对象的工厂类必须实现该接口。
2.ConcreteFactory(具体工厂角色):抽象工厂子类,实现在抽象工厂中声明的工厂方法。由客户端调用,返回一个具体产品类的实例。
3.Product(抽象产品角色):它是工厂类所创建所有对象的父类。
4.ConcreteProduct(具体产品角色):实现抽象产品类接口。
抽象工厂类:可以是接口、抽象类或者具体类
interface Factory
{
Product FactoryMethod();
}
class ConcreteFactory:Factory
{
public Product FactoryMethod()
{
return new ConcreteProduct();
}
}
客户端代码:
...
Factory factory;
factory = new ConcreteFactory();
Product product;
product = factory.FactoryMethod();
...
抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式:提供一个创建一系列相关或者相依赖的对象的接口,而无需指定它们的具体类型。
工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构
工厂方法模式包含以下4个角色:
1.Factory(抽象工厂角色):它声明一组用于创建一族产品的方法,每一个方法对应一种产品。
2.ConcreteFactory(具体工厂角色):抽象工厂子类,实现在抽象工厂中声明的工厂方法。由客户端调用,生成一组具体产品祖。
3.Product(抽象产品角色):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
4.ConcreteProduct(具体产品角色):它定义具体工厂生产的具体产品对象。
抽象工厂:
abstract class AbstractFactory
{
public abstract AbstractProductA CreateProductA();
public abstract AbstractProductB CreateProductB();
...
}
具体工厂:
class ConcreteFactory1:AbstractFactory
{
public override AbstractProductA CreateProductA() //工厂方法一
{
return new ConcreteProductA1();
}
public override AbstractProductB CreateProductB() //工厂方法二
{
return new ConcreteProductB1();
}
...
}