这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
- 1.举例制作果汁,首先提供两个接口类,果汁的种类和加冰多少。
1 2 3 4 5 6 7
| public interface MakeIce { void putIce(); } public interface MakeJuice { void juicing(); }
|
- 2.提供水果类和冰多少的类,这里方便起见,我们都写成内部类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| // 水果类 public class Fruits { static final String TAG = Fruits.class.getSimpleName(); public class Apple implements MakeJuice { @Override public void juicing() { Log.d(TAG, "Apple juice"); } } public class Mango implements MakeJuice { @Override public void juicing() { Log.d(TAG, "Mango juice"); } } public class Orange implements MakeJuice { @Override public void juicing() { Log.d(TAG, "Orange juice"); } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| // 冰类 public class Ice { static final String TAG = Ice.class.getSimpleName(); public class LittleIce implements MakeIce { @Override public void putIce() { Log.d(TAG, "little ice"); } } public class MoreIce implements MakeIce { @Override public void putIce() { Log.d(TAG, "More ice"); } } public class NoeIce implements MakeIce { @Override public void putIce() { Log.d(TAG, "No ice"); } } }
|
- 3.对于水果类,生成一个水果类工厂,获取一种水果对应一种果汁。对于冰类,生成一个冰类工厂。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class FruitsFactory { public MakeJuice getJuice(String want) { MakeJuice ret; switch (want) { case "apple": ret = new Fruits().new Apple(); break; case "orange": ret = new Fruits().new Orange(); break; case "mango": ret = new Fruits().new Mango(); break; default: ret = new Fruits().new Apple(); break; } return ret; } public MakeIce getIce(String want) { return null; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class IceFactory{ MakeIce ret; public MakeJuice getJuice(String want) { return null; } public MakeIce getIce(String want) { switch (want) { case "little": ret = new Ice().new LittleIce(); break; case "more": ret = new Ice().new MoreIce(); break; case "no": ret = new Ice().new NoeIce(); break; } return ret; } }
|
1 2 3 4 5 6 7 8 9
| public class FactoryTest { private void test(){ FruitsFactory fruitsFactory = new FruitsFactory(); MakeJuice makeJuice = fruitsFactory.getJuice("Fruits"); IceFactory iceFactory = new IceFactory(); MakeIce makeIce1 = iceFactory.getIce("no"); } }
|