创建型:Factory(工厂模式)
说到工厂,我们最新想到的应该是一堆堆的原料通过流水线组装成产品的场景吧?
其实对于一个程序员来讲,这个模式应该是很难不遇到的,特别是对于web开发的人员。为啥呢?因为这种场景在我们使用MVC的M层中是经常会遇到的。Hibernate的SessionFactory和JPA标准的EntityFactory。
所以说工厂模式用人类的语言来沟通的话,就是你给我清单上的原材料,我给你组装好的产品。非常简单的一个Demo(简单工厂):
package top.gabin.oa.web.design.factory; /** * 食物 * @author linjiabin on 16/4/30 */ public interface Food { String getName(); }
package top.gabin.oa.web.design.factory; /** * 面条 * @author linjiabin on 16/4/30 */ public class Noodles implements Food { @Override public String getName() { return "面条"; } }
package top.gabin.oa.web.design.factory; /** * 米饭 * @author linjiabin on 16/4/30 */ public class Rice implements Food { @Override public String getName() { return "米饭"; } }
package top.gabin.oa.web.design.factory; /** * 食物简单工厂类 * @author linjiabin on 16/4/30 */ public class SimpleFactory { public static Food createFood(String foodName) { if (foodName != null) { if (foodName.equals("Noodles")) { return new Noodles(); } else if (foodName.equals("Rice")) { return new Rice(); } } return null; } }
package top.gabin.oa.web.design.factory; import org.junit.Test; /** * 简单工厂测试类 * @author linjiabin on 16/4/30 */ public class TestSimpleFactory { @Test public void testSimple() { Food noodles = SimpleFactory.createFood("Noodles"); if (noodles != null) { System.out.println(noodles.getName()); } } }
输出:
面条
上面是一个很简单的工厂应用,一般我们不认为简单工厂是设计模式。我们认为的工厂模式一般指的是抽象工厂。
现在我们假设我是一家上市公司总公司的总裁,我们公司的主要业务是手机,而我们公司在全世界各地都有分工厂。
ok,现在首先我们希望有一个标准的抽象工厂类
package top.gabin.oa.web.design.factory.normal; import java.util.ArrayList; import java.util.List; /** * 手机工厂 * @author linjiabin on 16/4/30 */ public abstract class PhoneFactory { // 元件 private List<Component> componentList = new ArrayList<>(); // 获取组件 protected final List<Component> getComponentList() { componentList.add(new Screen()); componentList.add(new Camera()); return componentList; } // 订购手机 protected final Phone orderPhone() { Phone phone = createPhone(); return phone; } // 生产手机 public abstract Phone createPhone(); }
很明显,我们不希望我们的子公司自己去采购元件和出售手机,所以获取元件的方式和出售手机的方式还是由抽象父类来决定。而生产手机的具体流程由子类来实现。这就是将实例化对象的行为交给子类去决定,我也只给你这个权利,其他的你得听我的。
就像我们在厦门设置了一个分工厂:
package top.gabin.oa.web.design.factory.normal; import java.util.List; /** * * @author linjiabin on 16/4/30 */ public class XmPhoneFactory extends PhoneFactory { @Override public Phone createPhone() { Phone phone = new Phone() { }; // 获取所有元件, List<Component> componentList = getComponentList(); for (Component component : componentList) { // 组装 component.assembly(phone); } return phone; } }
demo中涉及的其他类:
package top.gabin.oa.web.design.factory.normal; /** * 手机 * @author linjiabin on 16/4/30 */ public class Phone { private Screen screen; private Camera camera; public Screen getScreen() { return screen; } public void setScreen(Screen screen) { this.screen = screen; } public Camera getCamera() { return camera; } public void setCamera(Camera camera) { this.camera = camera; } }
package top.gabin.oa.web.design.factory.normal; /** * 元件 * @author linjiabin on 16/4/30 */ public interface Component { /** * 组装方法 * @param phone */ void assembly(Phone phone); }
package top.gabin.oa.web.design.factory.normal; /** * 屏幕 * @author linjiabin on 16/4/30 */ public class Screen implements Component { @Override public void assembly(Phone phone) { phone.setScreen(this); } }
时间: 2024-12-30 22:20:05