具体的工厂模式可以分为简单工厂模式、工厂方法模式以及抽象工厂模式。
简单工厂模式
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。简单工厂模式的特点是仅仅有一个具体的创建者类,并且在此类中包含一个静态的工厂方法。
简单工厂模式由三种角色组成
1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
通俗点,我们可以这么理解。
一个土豪雇佣了一个厨师(工厂类角色),厨师当然会做菜(抽象产品角色),什么蒸羊羔儿、蒸熊掌、蒸鹿尾儿、烧花鸭、烧雏鸡、烧子鹅、炉猪、炉鸭、酱鸡、腊肉、松花、小肚儿、晾肉、香肠儿、什锦苏盘儿、熏鸡白肚儿(具体产品角色)他都会,目前也只会这些。土豪每天只需要对厨师说要吃什么,厨师就能帮他做什么,然后送到他面前就可以,土豪根本不用去关心厨师是怎么做的,这就是一个简单工厂模式。具体实现如下:
a.工厂类角色(厨师)
package Simple_Factory_Pattern;
public class Cook {
public static Food Make(String option) {//土豪说要吃啥厨师就做啥
Food food = null;
switch (option) {
case "蒸羊羔儿":
food = new lamb();
break;
case "烧花鸭":
food = new duck();
break;
// ...等等
}
return food;
}
}
b.抽象产品角色(菜)
package Simple_Factory_Pattern;
public interface Food {
public String describe();
}
c.具体产品角色(蒸羊羔儿、蒸熊掌、蒸鹿尾儿、烧花鸭、烧雏鸡、烧子鹅、炉猪、炉鸭、酱鸡、腊肉、松花、小肚儿、晾肉、香肠儿、什锦苏盘儿、熏鸡白肚儿)
//lamb.java
package Simple_Factory_Pattern;
public class lamb implements Food {
@Override
public String describe() {
// TODO Auto-generated method stub
return "蒸羊羔儿";
}
}
//duck.java
package Simple_Factory_Pattern;
public class duck implements Food {
@Override
public String describe() {
// TODO Auto-generated method stub
return "烧花鸭";
}
}//...太多就不写了
接下来,土豪登场
package Simple_Factory_Pattern;
public class Tuhao {
public static void main(String[] args) {
//土豪跟厨师说想吃烧花鸭
Food food=Cook.Make("烧花鸭");
System.out.println(food.describe());
}
}
以上就是简单工厂模式了。
那么简单工厂模式有哪些优缺点:
优点:
(1)客户类不直接创建产品类的对象,一切交给工厂类来创建,客户类只需要告知需求。(土豪不需要自己做饭,要吃告诉厨师就好了,交给厨师去处理)
(2)如果有新产品子类加入,不必修改已有的客户类代码。(土豪要吃啥,不用理自己会不会做)
缺点:
同样的菜吃多了总是会腻。有一天,土豪终于吃腻了,于是叫厨师做一道烩三鲜,此时厨师就必须请假去学习怎么做,在厨师学习的期间,土豪想吃什么都吃不了。这就是简单工厂模式的缺点:(1)由于工厂类必须知道怎么创建每个子类的对象,所以每当增加新产品类的时候,都需要修改工厂类的代码。不符合开闭原则(对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封闭,意味着类一旦设计完成,就可以独立其工作,而不要对类尽任何修改。)
由于土豪只雇了一个厨师,什么菜都交给他做,有一天厨师累到了,请假回家,此时,土豪想吃什么都吃不了。这就是简单工厂模式的缺点:
(2)由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
(3)简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
总结
简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
简单工厂模式适用情况包括:工厂类负责创建的对象比较少;客户端只知道传入工厂类的参数,对于如何创建对象不关心。
工厂方法模式
工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式由四种角色组成
1、抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2、具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
3、抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4、具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
通俗点,我们可以这么理解。
话接上回,日子一天一天地过,厨师过着水深火热的生活,土豪要吃什么全都叫他去做,一旦不会做,他就必须去学。吃着厨师做的菜,土豪的生意也越来越好,钱赚的越来越多。于是有一天,土豪叫来厨师,跟他说:“这么多年你辛苦了,接下来我会给你分配几十个手下(具体工厂角色),菜都由他们做,一人做一种,我要吃什么就叫他们做。遇到他们不会做的菜,就再招一个会做的进来,你(抽象工厂角色)只要好他们就行了!”这就是工厂方法模式。具体实现如下:
a.抽象工厂角色
package Factory_Method_Pattern;
public interface Cook {//老厨师熬出头了
public Food Make();
}
b.具体工厂角色
//duck_Cook.java 继承老厨师做烧花鸭
package Factory_Method_Pattern;
public class duck_Cook implements Cook {
@Override
public Food Make() {
return new duck();
}
}
//lamb_Cook.java 继承老厨师做蒸羊羔儿
package Factory_Method_Pattern;
public class lamb_Cook implements Cook {
@Override
public Food Make() {
return new lamb();
}
}
//...等等
c.抽象产品角色
package Factory_Method_Pattern;
public interface Food {
public String describe();
}
d.具体产品角色
//lamb.java
package Factory_Method_Pattern;
public class lamb implements Food {
@Override
public String describe() {
// TODO Auto-generated method stub
return "蒸羊羔儿";
}
}
//duck.java
package Factory_Method_Pattern;
public class duck implements Food {
@Override
public String describe() {
// TODO Auto-generated method stub
return "烧花鸭";
}
}//...太多就不写了
接下来,土豪登场
package Factory_Method_Pattern;
public class Tuhao {
public static void main(String[] args) {
Cook cook=null;
cook=new lamb_Cook();//土豪想吃蒸羊羔儿,叫来专门做蒸羊羔儿的厨师
Food food=cook.Make();
System.out.println(food.describe());
}
}
以上就是工厂方法模式。可以看出,它与简单工厂模式有许多相同之处,不同的地方在于工厂方法模式中核心工厂类将不再负责具体的产品生产,而是只制定一些规范,它只是一个抽象类或接口,具体的生产工作由其子类去完成。而简单工厂模式只有一个核心工厂类,是一个实体类,所有具体的生产都由它完成。
那么简单工厂模式有哪些优缺点:
优点:
(1)用户只需要关心所需产品对应的工厂,无须关心创建细节(土豪不需要关心菜怎么做,要吃什么叫专门的厨师去做就可以了)
(2)加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。(遇到厨师都不会做的菜,不用安排他们去学,再招一个就行了,有钱!!)缺点:
(1)在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。(每一种菜都要招一个厨师,虽然有钱,但是世界上菜色这么多,是首富也会承受不住。)
抽象工厂模式
参考
https://www.jb51.net/article/85699.htm
https://www.kancloud.cn/thinkphp/design-patterns/39768
http://www.cnblogs.com/wupeixuan/p/8669210.html