一、模式介绍
在工厂方法模式中,不再使用简单工厂方法模式中那个静态工厂方法,而是为每一种要生产的产品配备一个工厂,
每种工厂只生成一种特定产品,这样以后增加新产品时,直接新增对应的工厂就可以了,而不用修改原有的工厂。
二、工厂方法模式
1、实现步骤
第一步:定义产品抽象类。比如鞋子(Shoes.class)
// 1、定义鞋 产品抽象基类
abstract class Shoes {
// 展示logo
public abstract void showLogo();
}
第二步:定义具体产品类,继承产品抽象类。比如飞跃牌鞋子(FeiYueShoes.class)、回力牌鞋子(HuiLiShoes.class)
//2.定义具体品牌的鞋类,继承鞋抽象基类
public class HuiLiShoes extends Shoes {
@Override
public void showLogo() {
System.out.println("这是回力鞋");
}
}
//2.定义具体品牌的鞋类,继承鞋抽象基类
public class FeiYueShoes extends Shoes {
@Override
public void showLogo() {
System.out.println("这是飞跃鞋");
}
}
第三步:定义工厂类接口方法。比如鞋子工厂(ShoesFactory.class)
//3.定义工厂类接口
interface ShoesFactory {
public abstract Shoes produceShoes();
}
第四步:定义具体产品工厂类,实现工厂类接口。比如飞跃牌鞋子工厂(FeiYueShoesFactory.class)、回力牌鞋子工厂(HuiLiShoesFactory.class)
//4.定义生产具体产品工厂类,如生成回力鞋的工厂
public class HuiLiShoesFactory implements ShoesFactory {
@Override
public Shoes produceShoes() {
return new HuiLiShoes();
}
}
//4.定义生产具体产品工厂类,如生成飞跃鞋的工厂
public class FeiYueShoesFactory implements ShoesFactory {
@Override
public Shoes produceShoes() {
return new FeiYueShoes();
}
}
第五步:使用工厂方法模式,生成产品。比如(FactoryMethodExample.class)
// 工厂方法模式
public class FactoryMethodExample {
public static void main(String[] args) {
//生成飞跃鞋
FeiYueShoesFactory feiYueShoesFactory = new FeiYueShoesFactory();
feiYueShoesFactory.produceShoes().showLogo();
//生成回力鞋
HuiLiShoesFactory huiLiShoesFactory = new HuiLiShoesFactory();
huiLiShoesFactory.produceShoes().showLogo();
//如果新增鞋子品牌,生成对应具体产品类,具体产品工厂类,比如老北京布鞋
// LaoBeiJIngShoesFactory laoBeiJIngShoesFactory = new LaoBeiJIngShoesFactory();
// laoBeiJIngShoesFactory.produceShoes().showLogo();
}
}
2、总结
和简单工厂模式相比,工厂方法模式中,工厂类取代了简单工厂模式中的静态方法,如果需要扩展,比如要生产老北京布鞋
第一步:定义具体产品类,继承产品抽象类。比如老北京布鞋(LaoBeiJIngShoes.class)
第二步:定义具体产品工厂类,实现工厂类接口方法。比如老北京布鞋工厂(LaoBeiJIngShoesFactory.class)
第三步:使用工厂方法模式,生成产品。比如(FactoryMethodExample.class)
通过工厂方法模式,新在增加一种产品的时候就只要扩展两个类,符合开闭原则。解决了简单工厂模式存在的问题。
public class LaoBeiJIngShoes extends Shoes {
@Override
public void showLogo() {
System.out.println("这是老北京布鞋");
}
}
public class LaoBeiJIngShoesFactory implements ShoesFactory {
@Override
public Shoes produceShoes() {
return new LaoBeiJIngShoes();
}
}
缺点
工厂方法模式每增加一种产品就要相应的增加一个工厂类,比较繁琐。而且每个工厂只能生成一种产品,
无法生成其他产品,比如飞跃T恤,比较浪费。