定义:工厂方法模式(FactoryMethod Pattern),定义一个用于创建对象的接口,让子类决定实例化哪一个类。定义一个抽象工厂类,每一个产品,按照抽象工厂的基本要求新建一个工厂来生产新的产品。
类型:创建型模式。
类图:
参与角色:
- AbstrctProduct,提供产品生产的标准接口。
- ConcreteProductA,ConcreteProductB,按接口具体去实现生产的产品。
- AbstractFactory,提供标准工厂规模的抽象工厂。
- ConcreteFactoryA,ConcreteFactoryB,按接口标准定制的具体生产产品的在厂。
概述:
简单工厂模式,在使用时,会违背OCP原则。工厂方法模式就是为了解决这一问题而产生的。每当有一个新的产品要生产时,不用去更改原有的产品线,也不用去修改原有的工厂,一切按规定析添加。这样产品的生产流程一致,新工厂的建造也一致。工厂原有的生产管理方法便可以继续使用,而且人员也不用重新培训,就可以直接上岗。
因为当增加新的订单时,不需要去更改旧有的产品线以及工厂,这样就可以最大限度的保证原有的产品能够正常运行。这一点,就是工厂方法的核心。下面就以代码来展现这一过程。
代码:
// C++
#include <iostream>
#include <afxcom_.h>
using namespace std;
class CCellPhone
{
public:
virtual void ProducePhone()
{
cout<<"Produce Normal Phone."<<endl;
}
};
class CNokia : public CCellPhone
{
public:
virtual void ProducePhone()
{
cout<<"Produce Nokia Phone."<<endl;
}
};
class CSamsung : public CCellPhone
{
public:
virtual void ProducePhone()
{
cout<<"Produce Samsung Phone."<<endl;
}
};
class CPhoneFactory
{
public:
virtual CCellPhone* CreatePhone() = 0;
};
class CNokiaFactory : public CPhoneFactory
{
public:
virtual CCellPhone* CreatePhone()
{
CCellPhone *pPhone = new CNokia();
return pPhone;
}
};
class CSamsungFactory : public CPhoneFactory
{
public:
virtual CCellPhone* CreatePhone()
{
CCellPhone *pPhone = new CSamsung();
return pPhone;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
// Nokia cellphone production line
CPhoneFactory* pNokiaFactory = new CNokiaFactory();
CCellPhone* pNokiaPhone = pNokiaFactory->CreatePhone();
pNokiaPhone->ProducePhone();
// Samsung cellphone production line
CPhoneFactory* pSamsungFactory = new CSamsungFactory();
CCellPhone* pSamsungPhone = pSamsungFactory->CreatePhone();
pSamsungPhone->ProducePhone();
delete pNokiaPhone;
pNokiaPhone = NULL;
delete pSamsungPhone;
pSamsungPhone = NULL;
return 0;
}
// C#代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace Phone
{
public class CellPhone
{
public virtual void ProducePhone()
{
Console.WriteLine("Produce Normal Phone.");
}
}
class Nokia : CellPhone
{
public override void ProducePhone()
{
Console.WriteLine("Produce Nokia Phone.");
}
}
class Samsung : CellPhone
{
public override void ProducePhone()
{
Console.WriteLine("Produce Samsung Phone.");
}
}
public interface IFactory
{
CellPhone CreatePhone();
}
public class NokiaFactory : IFactory
{
public CellPhone CreatePhone()
{
CellPhone phone = new Nokia();
return phone;
}
}
public class SamsungFactory : IFactory
{
public CellPhone CreatePhone()
{
CellPhone phone = new Samsung();
return phone;
}
}
class Program
{
static void Main(string[] args)
{
IFactory nokiaFactory = new NokiaFactory();
CellPhone phone = nokiaFactory.CreatePhone();
phone.ProducePhone();
IFactory samsungFactory = new SamsungFactory();
phone = samsungFactory.CreatePhone();
phone.ProducePhone();
}
}
}
package CellPhone;
public interface IFactory {
IPhone createPhone();
}
package CellPhone;
public interface IPhone {
void producePhone();
}
package CellPhone;
public class NokiaFactory implements IFactory {
public IPhone createPhone()
{
IPhone phone = new NokiaPhone();
return phone;
}
}
package CellPhone;
public class NokiaPhone implements IPhone {
public void producePhone()
{
System.out.println("Produce nokia phone.");
}
}
package CellPhone;
public class SamsungFactory implements IFactory {
public IPhone createPhone()
{
IPhone phone = new SamsungPhone();
return phone;
}
}
package CellPhone;
public class SamsungPhone implements IPhone {
public void producePhone()
{
System.out.println("Produce samsung phone.");
}
}
/**
* CellPhone.java
*/
package CellPhone;
/**
* @author feihe027@163.com
*
*/
public class CellPhone {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
IFactory factory = new NokiaFactory();
IPhone phone = factory.createPhone();
phone.producePhone();
factory = new SamsungFactory();
phone = factory.createPhone();
phone.producePhone();
}
}
优缺点:
- 优点,能够最大限度地保证对修改关闭,对扩展开放。新的产品,都是通过新添加代码来完成而不是去修改原有代码来完成。
- 缺点,每添加一个新产品,就新建一个工厂,稍显有点浪费。如果工厂过多,管理工厂也会成为一件麻烦事。抽象工厂模式正好解决这一问题。
参考资料:
- 《设计模式——可复用面向对象软件基础》
- 《Java与模式》
- 《大话设计模式》