##工厂方法模式
前一篇http://blog.csdn.net/qq_29924041/article/details/59118775文章中提到了简单工厂模式
用小米举的栗子,本篇幅主要讲解的是工厂方法模式,依旧用的是小米;
先上张图:
图说小米工厂方法模式:
小米现在旗下有手机XiaoMiShoujiProduct,手环XiaoMiShouHuanProduct,电脑业务XiaoMiConputerProduct,但是这些产品都统一是小米的相关产品XiaoMiPoduct,那么小米就需要有对应的工厂来生产这些产品,那之前的简单工厂模式,是一个工厂,在不同的时间段,或者分成不同的车间,来生产这些产品,但是工厂方法模式中,我们需要用不同的工厂来生产对应的产品,所以现在也就有了XiaoMiComputerFactory,XiaoMiShouHuanFactory,XiaoMiShoujiFactory,但是他们应该有这一个共同的特性就是"都是小米的生产工厂"吧,所以也就抽象出来一个XiaoMiFactory;
那么到这里,应该都很好理解了吧,小米工厂生产产品,那么工厂方法模式,就是一个工厂对应一种产品这样的生产,思路很简单,下面直接上代码:
XiaoMiFactory(小米总工厂)
package com.demo.FactoryMethod;
public abstract class XiaoMiFactory {
public abstract XiaoMiProduct produceProduct();
}
XiaoMiProduct(小米总产品)
package com.demo.FactoryMethod;
public abstract class XiaoMiProduct {
public abstract String getProductName();
}
XiaoMiComputerFacotry(电脑生产工厂)
package com.demo.FactoryMethod;
public class XiaoMiComputerFacotry extends XiaoMiFactory {
@Override
public XiaoMiProduct produceProduct() {
// TODO Auto-generated method stub
return new XiaoMiComputerProduct();
}
}
XiaoMiComputerProduct(电脑产品)
package com.demo.FactoryMethod;
public class XiaoMiComputerProduct extends XiaoMiProduct{
@Override
public String getProductName() {
// TODO Auto-generated method stub
System.out.println("XiaoMiComputerProduct");
return "XiaoMiComputerProduct";
}
}
XiaoMiShouHuanFacotry(小米手环工厂)
package com.demo.FactoryMethod;
public class XiaoMiShouHuanFacotry extends XiaoMiFactory{
@Override
public XiaoMiProduct produceProduct() {
// TODO Auto-generated method stub
return new XiaoMiShouHuanProduct();
}
}
XiaoMiShouHuanProduct(小米手环产品)
package com.demo.FactoryMethod;
public class XiaoMiShouHuanProduct extends XiaoMiProduct{
@Override
public String getProductName() {
// TODO Auto-generated method stub
System.out.println("XiaoMiShouHuanProduct");
return "XiaoMiShouHuanProduct";
}
}
XiaoMiShoujiFactory(小米手机工厂)
package com.demo.FactoryMethod;
public class XiaoMiShoujiFactory extends XiaoMiFactory{
@Override
public XiaoMiProduct produceProduct() {
// TODO Auto-generated method stub
return new XiaoMiShoujiProduct();
}
}
XiaoMiShoujiProduct(小米手机产品)
package com.demo.FactoryMethod;
public class XiaoMiShoujiProduct extends XiaoMiProduct{
@Override
public String getProductName() {
// TODO Auto-generated method stub
System.out.println("XiaoMiShoujiProduct");
return "XiaoMiShoujiProduct";
}
}
测试代码:
package com.demo.FactoryMethod;
public class FactoryMethodTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
XiaoMiFactory xiaoMiFactory = new XiaoMiComputerFacotry();
XiaoMiFactory xiaoMiShoujiFactory = new XiaoMiShoujiFactory();
XiaoMiFactory xiaoMiShouHuanFactory = new XiaoMiShouHuanFacotry();
xiaoMiFactory.produceProduct().getProductName();
xiaoMiShoujiFactory.produceProduct().getProductName();
xiaoMiShouHuanFactory.produceProduct().getProductName();
}
}
结果就不在这里run了。有兴趣的可以copy代码下去run一下,
其实无论是简单工厂模式,还是工厂方法模式,其思路相对来说都是比较简单的,简单工厂模式就是一个工厂能够生产不同的产品,而工厂方法模式就是一个工厂对应一个产品的生产过程,其实在上面也可以看到,简单工厂模式主要造成没增加一个产品的时候都是需要去对工厂类进行修改的过程,违反了开闭原则,而工厂方法模式的方法,对扩展来说相对来说是比较容易的,但是工厂方法模式其实也是有一个很大的弊端,也就是在上面可以看到的,就是怎么这样的一个生产过程会有辣么多的类生成,无疑,工厂方法模式的类确实是有点多,这就给我们的项目增加了点类。有利就有弊,都是把双刃剑,所以在实战的时候,要选择好最适合自己的
谢谢大家的访问
##欢迎访问博客