标签:
GOF:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
类图:
适用性:
Factory Method相当于一个特殊的new。
使用工厂方法的原因:
(1)当new代码很多很复杂,而且耗时长,这时不仅代码难看,而且初始化类的时间会很长。----> 这时就能将大多数初始化的行为放到factory中。(封装与分派)
(2)某个类有很多子类,每次使用都要在客户代码区利用长长的if-else,switch等语句来判断使用哪个子类。----> 将这些if-else等语句放到某个方法中,封装起来。 ----> 进一步放到factory中,由factory统一管理这些子类的创建。
工厂的类型:
1.每个产品都对应一个具体工厂
2.简单工厂。在FactoryMethod方法加入参数,然后通过判断参数来创建不同的Product。
3.使用模板。
简单工厂代码:
public class test { private static Factory factory; public static void main(String[] args) { factory = new ConcreteFactory(); Car car = factory.createCar("Benz"); car.drive(); } } interface Factory { Car createCar(String type); } class ConcreteFactory implements Factory { private void init() {}; //想象这里是很复杂的初始化 public ConcreteFactory() { init(); } @Override public Car createCar(String type) { switch (type) { case "Benz": return new Benz(); case "Audi": return new Audi(); default: return new normal(); } } } interface Car { public void drive(); } class normal implements Car { public void drive() { System.out.println("normal car"); } } class Benz implements Car { public void drive() { System.out.println("Benz"); } } class Audi implements Car { public void drive() { System.out.println("Audi"); } }
使用模板:
class Creator { public: virtual Product* create() = 0; }; template <typename TheProduct> class StandardCreator : public Creator { public: virtual Product* create(); }; template <typename TheProduct> class StandardCreator<TheProduct>::create() { return new TheProduct(); }
总结:工厂根据你提供的图纸(String type),生产出你想要的东西。
标签:
原文地址:http://www.cnblogs.com/programmer-kaima/p/4367823.html