前言:
看了网络上很多关于设计模式的方法,有的模式看起来相似,但本质还是区别很大的.像简单工厂,工厂方法和抽象工厂就有很明显的区别.
有一个比较好理解的例子,在这跟大家介绍下:
1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.
2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.
3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.
所以我个人认为,简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.
1、工厂方法模式(Factory Method)
1.1、普通工厂模式(静态工厂),就是建立一个工厂类,对实现了同一接口的一些类根据用户需求进行实例的创建。首先看下关系图:
概念这些比较绕,直接举例吧!(我们举个手机工厂的例子)
第一步:创建一个手机接口,定义一个生产手机的公共方法;
public interface MobilePhone { public void production (); }
第二步:创建具体实现类
public class HuaWei implements MobilePhone{ public void production() { // TODO Auto-generated method stub System.out.println("华为手机生产"); } } public class Vivo implements MobilePhone{ public void production() { System.out.println("vivo手机生产"); } }
第三步:创建工厂类
public class MobilePhoneFactory { public MobilePhone produceFactory(String name){ if ("HuaWei".equals(name)) { return new HuaWei(); } else if ("Vivo".equals(name)) { return new Vivo(); } else { System.out.println("请输入正确的类型!"); return null; } } }
最后测试一下
public class Test { public static void main(String[] args) { MobilePhoneFactory m=new MobilePhoneFactory(); MobilePhone mobilePhone=m.produceFactory("Vivo"); mobilePhone.production(); } }
输出:vivo手机生产
总结:简单工厂相当于一个模子,根据传入的参数通过一些自己的逻辑判断;生产出不同类型的相应的产品、对象。但这种模式局限性很大,一但参数错误,就不能做出正确的操作,而且新增一些产品就要更改工厂类;所以这种模式一般用于比较简单的场景;
1.2、多个工厂方法模式
多个工厂方法模式是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而且新增一些产品就要更改工厂类;而多个工厂方法模式是提供多个工厂方法,分别创建对象。
只要将上面的工厂做下修改即可;如下:
public abstract class Factory { public abstract MobilePhone getMobilePhone(); } public class HuaWeiFactory extends Factory{ @Override public MobilePhone getMobilePhone() { // TODO Auto-generated method stub return new HuaWei(); } } public class VivoFactory extends Factory{ @Override public MobilePhone getMobilePhone() { // TODO Auto-generated method stub return new Vivo(); } }
测试如下:
public class Test {
public static void main(String[] args) {
Factory m=new HuaWeiFactory();
MobilePhone mobilePhone=m.getMobilePhone();
mobilePhone.production();
}
}
输出:华为手机生产
2:抽象工厂
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类;如下图:
还是用手机的例子,但现在生产手机的同时还要生产配套的充电器;增加代码如下:
public interface MobilepHoneAccessories { public void production (); } public class VivoTheCharger implements MobilepHoneAccessories{ public void production() { // TODO Auto-generated method stub System.out.println("vivo充电器生产"); } } public class HuaWeiTheCharger implements MobilepHoneAccessories{ public void production() { System.out.println("华为充电器生产"); } }
工厂修改如下:
public abstract class Factory { //手机生产 public abstract MobilePhone getMobilePhone(); //充电器生产 public abstract MobilepHoneAccessories getThrCharger(); } public class HuaWeiFactory extends Factory{ @Override public MobilePhone getMobilePhone() { // TODO Auto-generated method stub return new HuaWei(); } @Override public MobilepHoneAccessories getThrCharger() { // TODO Auto-generated method stub return new HuaWeiTheCharger(); } } public class VivoFactory extends Factory{ @Override public MobilePhone getMobilePhone() { // TODO Auto-generated method stub return new Vivo(); } @Override public MobilepHoneAccessories getThrCharger() { // TODO Auto-generated method stub return new VivoTheCharger(); } }
测试如下:
public class Test { public static void main(String[] args) { Factory m=new HuaWeiFactory(); MobilePhone mobilePhone=m.getMobilePhone(); MobilepHoneAccessories mha=m.getThrCharger(); mobilePhone.production(); mha.production(); } }
输出:华为手机生产
华为充电器生产
总结:
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)