三、经典模式(2)工厂模式

简单工厂模式(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();
     }
     ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值