工厂可以分为三种:简单工厂、工厂模式和抽象工厂,三者的关系是递进的,以做包子为例,刚开始只有两种包子:豆腐包和牛肉包,可以使用简单工厂(或者叫静态工厂)来解决,随着包子种类的越来越多,发现没添加一种包子,就需要改工厂类,扩展性太差,因此出现了工厂模式,提取一个公共的做包子接口,然后针对每一种包子建一个工厂类来专门生产这种包子,随后店面扩大,开始卖豆浆了,豆浆是不能在包子工厂里生产的,因此这时候就需要提取一个公共的既可以做包子又可以做豆浆的接口,然后每一个工厂去实现这个接口,这样每个工厂就都可以既生产包子又生产豆浆,只是种类不同,这就是抽象工厂。工厂方法和抽象工厂的最大区别在于工厂模式是用来创建同一个产品的不同类型的,但是抽象工厂模式是用来创建不同类的产品。
下面给出三种模式的类图和简单代码
1、简单工厂
类图
结构非常简单,定义一个包子接口,两个具体实现类,再有一个工厂负责根据名字生产不同的包子。可以看出,简单工厂扩展性非常差,例如我们要生产青菜包,则需要去修改工程类,违背了开闭原则。代码如下
package simpleFactory; public interface BaoZi { void method(); }
package simpleFactory; public class DouFuBao implements BaoZi { @Override public void method() { System.out.println("豆腐包"); } }
package simpleFactory; public class NiuRouBao implements BaoZi { @Override public void method() { System.out.println("牛肉包"); } }
package simpleFactory; import java.util.Objects; public class SimpleFactory { public BaoZi create(String name) { if(Objects.equals("DouFuBao", name)) { return new DouFuBao(); } if(Objects.equals("NiuRouBao", name)) { return new NiuRouBao(); } return null; } }
2、工厂模式
类图
工厂模式中,我们提取了一个抽象的工厂接口,这个接口中有一个方法那就是生产包子,然后对每一种包子我们都有对应的工厂类去专门负责创建,这样子当我们需要再添加一种包子的时候,只需添加包子类和对应的工程类,不需对原有代码进行修改。代码如下
package Factory; public interface BaoZi { void method(); }
package Factory; public class DouFuBao implements BaoZi { @Override public void method() { System.out.println("豆腐包"); } }
package Factory; public class NiuRouBao implements BaoZi { @Override public void method() { System.out.println("牛肉包"); } }
package Factory; public class DouFuBaoFactroy implements IFactory{ @Override public BaoZi create() { return new DouFuBao(); } }
package Factory; public class NiuRouBaoFactroy implements IFactory{ @Override public BaoZi create() { return new NiuRouBao(); } }
package Factory; public interface IFactory { BaoZi create(); }
3、抽象工厂
类图
可以看到,在抽象工厂中我们定一个一个工厂接口,它含有两个方法,分别可以生产包子和豆浆,然后有具体的工厂类去实现它完成实体的创建,具体实体类不再贴出,代码如下
package AbstractFactory; public interface IFactory { BaoZi createBaoZi(); DouJiang createDouJiang(); }
package AbstractFactory; public interface BaoZi { void method(); }
package AbstractFactory; public interface DouJiang { void method(); }
package AbstractFactory; public class Factroy1 implements IFactory{ @Override public BaoZi createBaoZi() { return new DouFuBao(); } @Override public DouJiang createDouJiang() { return new LvDouJiang(); } }
package AbstractFactory; public class Factroy2 implements IFactory{ @Override public BaoZi createBaoZi() { return new NiuRouBao(); } @Override public DouJiang createDouJiang() { return new HuangDouJiang(); } }