[创建型模式系列]simple factory & factory method 简单工厂类和工厂方法类的概念及区别

1.simple factory pattern简单工厂类模式
    simple factory is that all products are produced by the respectice concrete method from simple factory.
    简单工厂类就是所有其产品都是由简单工厂的具体方法来生产的。
    还是以abstract类介绍的桌子生产过程为例。有关桌子生产的相关描述,请参考http://www.cnblogs.com/Winston/archive/2008/05/13/1194995.html
     在简单工厂模式下,生产桌面(不管方形桌面还是圆形桌面)和桌腿(不管大腿还是mini腿)都在一起。
    我们有一个简单工厂类如下:    
public class SimpeFactory
{
    public BigLeg Create_BigLeg()
    {
        return new BigLeg();
    }
    public MiniLeg Create_MiniLeg()
    {
        return new Create_MiniLeg();
    }
    public Rectang_Desktop Create_Rectangle_Desktop
    {
        return new Rectangle_Desktop();
    }
    public Circle_Desktop Create_Circle_Desktop
    {
        return new Circle_Desktop();
    }
}
public class BigLeg
{}
public class MiniLeg
{}
public class Rectangle_Desktop
{}
public class Circle_Desktop
{}

//说明:当然,产品也可以继承于抽象产品类。在各自的产品中实现产品。

此时,客户端可以根据命令,生产相应的产品,但是产品间是毫无关联的。例如
SimpeFactory factory=new SimpleFactory();
Rectangle_Desktop desktop=factory.Create_Rectangle_Desktop();
MiniLeg leg=factory.Create_Mini_Leg();
也就是说,有可能我们生产出的是方形桌面和mini腿,或者圆形桌面和大号桌腿。试想如果将这两种产品组装在一起,会是什么样的怪胎!
这就是简单工厂模式

2.Factory method pattern工厂方法模式
    Factory method定义一个用于创建对象的接口,让子类决定实例化哪一个类,这种方式叫做lazy initiation.也就是说,对于要生产那一种具体产品,都延迟到相应具体的工厂来创建。
    public abstract class Creator
{
public abstract Leg Create_BigLeg();
public abstract Leg Create_MiniLeg();
public abstract Desktop Create_Rentangle_Desktop();
public abstract Desktop Create_Circle_Desktop();
}
    public class TableCreator:Creator
{
    public Leg Create_BigLeg()
    {
        return new BigLeg();
    }
    ......
}
然后在客户端,我们可以这样调用
Creator factory=new TableCreator();
其存在的问题仍然是创建的产品之间毫无关联。

这时,为了创建一系列相互关联的产品,我们可以创建一系列相互关联或依赖的接口或抽象类,即抽象工厂了。具体可见文章http://www.cnblogs.com/Winston/archive/2008/05/13/1194995.html
。这样,我们就不可能生产出方形桌面和mini桌腿的产品了。只需要给某个工厂下达命令,该工厂就会生产出相应的产品。至于如何生产的过程,都被encapsulate到了具体工厂里面了(比如mini桌生产工厂,办公桌生产工厂),很显然,每个具体工厂不可能生产出方形桌面和mini桌腿这样组合的怪产品了(否则厂长都下岗了 :))。
【推广】 免费学中医,健康全家人
原文地址:https://www.cnblogs.com/Winston/p/1195165.html