工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
这里面举一个恰当的小例子:
需求是这样的,你有一个商店,商店里面有三种卖东西的方式,根据的总钱数和传递进来卖东西的方式来确定最后结账需要付钱的总数。
如果是平时的话,我们在一个类里面写一大堆的方法来弄,但是如果要用工厂模式呢,我们要怎么办呢?
第一步:建立一个工厂类,这个类里面只有一个静态方法,这个方法就是我们卖货物的售卖方式,并且当我们调用这个方法的时候会往方法里面传递一个售卖货物的的方式。如下面代码所示:
public class SaleFactory { public static SaleBehavior create(int which){ switch (which) { case Store.DISCOUNT_5: return new SaleHalf(); case DISCOUNT_8: return new SaleEight(); case DISCOUNT_FULL: return new SaleFull(); default: return new SaleDefault(); } } }
第二步:建立四个售卖货物的方法,这四个方法要分开建立到不同的类,
但是这四个法唯一的不同就是数据算法的不同,所以呢让他们都实现了卖东西的接口
public interface SaleBehavior { float sale(float money); }当这四个方法实现了这个接口的时候都会复写sale的方法,根据自己卖东西的特点,在这里面进行具体问题具体分析,。比如半价出售的可以这么写
public class SaleHalf implements SaleBehavior { @Override public float sale (float money) { return money * 0.5f; } }
第三步:在商店类里面进行归总,首先卖东西是要有卖东西的对象的,并且这里面要把金钱的总钱数算清楚,如下面代码所示
public class Store { public static final int DISCOUNT_5 = 1; public static final int DISCOUNT_8 = 2; public static final int DISCOUNT_FULL = 3; private SaleBehavior mBehavior; public float sell (int count, float price) { float money = count * price; if (mBehavior == null) return money; return mBehavior.sale(money); } public void setBehavior (SaleBehavior behavior) { mBehavior = behavior; } }第四步:当我们要用到这个类的时候,我们就可以用下面的方式进行实现了Store store = new Store();
store.setBehavior(new SaleFull());
float money = store.sell(3, 200);这里面是new出来一个商店类,给商店类加一个打折的方式,然后把钱 和商品的数量输入进去就可以了,,通过工厂模式写出来的代码必要多,但是后期的维护很容易,不用 改主体