首先在我们所定义的23种设计模式中,是不存在简单工厂模式的,很明显原因就是它并不能满足开闭原则。我们可以尝试去理解一下简单工厂,比如我走在路上感觉有点口渴,周围正好有一个饮料工厂,我走过去说,厂长来给我一瓶阔落,然后我拿到了一瓶阔落。这种方法就是满足了我们不用去造饮料,而是通过自己的医院去工厂,让他们造,我们可以简单的通过代码来实现。
如果是我们自己造,那就是new一个对象,比如说:Drinks drink = new Cola(),其实通过简单的例子我们可能会认为这样岂不是很简单?看起来是这样的,但是如果我们放入一个工程里,这样的弊端就出现了,我们稍微改一点东西,可能蝴蝶扇动的翅膀,会变成飓风来袭击我们。我在这只是表达出思想,至于哪个比较方便简单,还是要看环境的。
简单工厂模式
首先我先创建Drinks类,并且创建出三个子类
public class Drinks { public String getName() {return null;} } public class Cola extends Drinks{ @Override public String getName() {return "这是一瓶阔落";} } public class Fanta extends Drinks { @Override public String getName() {return "这是一瓶分答";} } public class Beer extends Drinks { @Override public String getName() {return "这是一瓶皮九";} }
然后我们先实现一个工厂,通过代码就可以发现,这个方法的原则就是:工厂类根据传入的参数,动态的确定制造的产品。我们通过传入参数来获得饮料,但是如果想新增一个饮料,就要对代码进行更改,很容易出错,这样看来就是不符合开闭原则。
public class simpleFactory { public Drinks getDrink(int name) { Drinks drink; switch (name) { case 1: drink = new Cola(); break; case 2: drink = new Fanta(); break; case 3: drink = new Beer(); break; default: drink = null; } return drink; } }
工厂方法模式
接下来就是工厂方法模式,工厂方法就是我们现在对于一个品种的饮料有了相对性的专门工厂了,我们只要到了那个工厂,什么都不用说,就会得到我们想要的饮料了。工厂方法的原理就是有一个模板工厂,他规定了工厂的职能,然后相应的工厂按照这个规则实现他们相应的能力。
public interface IFactory {public Drinks getDrink();} public class ColaFactory implements IFactory { public Drinks getDrink() { return new Cola(); } }
抽象工厂模式
最后是抽象工厂模式,其实工厂方法已经具备开闭原则了,那么抽象工厂的出现改变了什么呢?话不多说,先上代码。
public abstract class abstractFactory { public abstract Drinks getCola(); public abstract Drinks getFanta(); } public class drinkFactory extends abstractFactory { public Drinks getCola() { return new Cola(); } public Drinks getFanta() { return new Fanta(); } }
其实道理很简单,工厂模式中,我甚至可以加入一个美年达,虽然他们不肯能是一个工厂里出来的,但是这两个工厂可以满足同样的功能,所以是没问题的,然而在抽象工厂里,芬达和美年达是不可能由一个工厂生产的。换句话来概述一下:工厂模式的重点在于生成产品,抽象工厂的重点在于生成产品的同时,规定了产品之间的关系。