1、概述
- 意图: 创建型设计模式,我们只管使用生成的产品(对象),而不关心产品是怎么生成的(对象实例化自哪一个工厂类)
- 缺点: 增加了复杂度
- 注意: 工厂模式适宜于复杂对象,简单对象,直接new就可以了
2、简单工厂(一个工厂多个方法)
比如:我今天想吃面了,抽象一个面条的基类,接口也可以
public abstract class MyNoodles {
/**
* 每种面条的描述
*/
public abstract void desc();
}
先来一份最近吃的最多的——扁豆焖面
public class BDNoodles extends MyNoodles{
@Override
public void desc() {
System.out.println("扁豆焖面,在北京吃它,代替曾经的襄县焖面");
}
}
再来一份辣点的——重庆小面
public class CQNoodles extends MyNoodles{
@Override
public void desc() {
System.out.println("重庆小面,辣上瘾");
}
}
最后是经典的——油泼面
public class YPNoodles extends MyNoodles{
@Override
public void desc() {
System.out.println("油泼面,陕西人的最爱");
}
}
多方法工厂
public class SimpleFactory {
/**
* 生成扁豆焖面
* @return
*/
public static BDNoodles createBD(){
return new BDNoodles();
}
/**
* 生成重庆小面
* @return
*/
public static CQNoodles createCQ(){
return new CQNoodles();
}
/**
* 生成油泼面
* @return
*/
public static YPNoodles createYP(){
return new YPNoodles();
}
}
使用时:
MyNoodles lunch = SimpleFactory.createBD();
lunch.desc();
输出:
扁豆焖面,在北京吃它,替代曾经的襄县焖面
Java源码支持:
java.util.concurrent.Executors
类便是一个多方法简单工厂模式,生成Executor
3、普通工厂
普通工厂就是把上面的简单工厂,分成两层:**工厂基类层+工程子类层
工厂基类:
public abstract class MyNoodlesFactory {
public abstract MyNoodles create();
}
扁豆焖面工厂
public class BDFactory extends MyNoodlesFactory{
@Override
public MyNoodles create() {
return new BDNoodles();
}
}
重庆小面工厂
public class CQFactory extends MyNoodlesFactory{
@Override
public MyNoodles create() {
return new CQNoodles();
}
}
油泼面工厂
public class YPFactory extends MyNoodlesFactory{
@Override
public MyNoodles create() {
return new YPNoodles();
}
}
使用时:
MyNoodlesFactory factory = new YPFactory();
MyNoodles dinner = factory.create();
dinner.desc();
输出:
油泼面,陕西人的最爱
普通工厂与简单工厂的区别:
普通工厂把产品的实例化延迟到具体产品的工厂子类中,写起来繁琐一点。
产品需求变化时,普通工厂只需要增删对应的类即可,不需要修改源代码,简单工厂则需要修改对应的静态方法
##4、参考:
https://blog.csdn.net/zxt0601/article/details/52798423
设计模式(一) 工厂模式 五种写法总结