- public class OldStore {
- Pizza orderPizza() {
- Pizza pizza = new Pizza();
- pizza.prepare();
- pizza.bake();
- pizza.cut();
- pizza.box();
- return pizza;
- }
- }
- public class OldStore {
- Pizza orderPizza(String type) {
- Pizza pizza = new Pizza();
- //-----不停变化的部分-----
- if (type.equals("cheese")) {
- pizza = new ChessePizza();
- } else if (type.equals(”greek”)) {
- pizza = new GreekPizza();
- } else if (type.equals(”other”)) {
- //other type
- }
- //----------------------
- pizza.prepare();
- pizza.bake();
- pizza.cut();
- pizza.box();
- return pizza;
- }
- }
我们可以发现,如果要增加不同的种类,那么,我们就必须去修改oderPizza()方法里的代码,这样,oderPizza()无法对修改关闭,所以我们需要进一步使用封装。下面给出三种类型的工厂模式。
- public class SimplePizzaFactroy {
- public Pizza createPizza(String type) {
- Pizza pizza = null;
- if (type.equals(”cheese”)) {
- pizza = new CheesePizza();
- } else if (type.equals(”greek”)) {
- pizza = new GreekPizza();
- } else if (type.equals(”other”)) {
- // other type.
- }
- return pizza;
- }
- }
- public class PizzaStore {
- SimplePizzaFactory factory; //加入一个对SimplePizzaFactory的引用
- //构造需要一个工厂作为参数
- public PizzaStore(SimplePizzaFactory factory) {
- this.factory = factory;
- }
- public Pizza orderPizza(String type) {
- Pizza pizza;
- //该方法通过简单传入订单类型来使用工厂创建披萨
- pizza = factory.createPizza(type); // new操作符被换为工厂对象创建方法
- pizza.prepare();
- pizza.bake();
- pizza.cut();
- pizza.box();
- return pizza;
- }
- }
即以SimplePizzaFactory为父类,派生不同的工厂类。当我们希望能够建立一个框架,把加盟店和创建披萨捆绑在一起,保持披萨的质量控制,同时使得代码具有一定的弹性。我们应该怎么做呢?
- NYPizzaFactory nyFactory = new NYPizzaFactory();
- PizzaStore nyStore = new PizzaStore(nyFactory);
- nyStore.orderPizza(”Veggie”);
- ChicagoPizzaFactory chicagoFactory = new ChicagoPizzaFactory();
- PizzaStore nyStore = new PizzaStore(chicagoFactory);
- nyStore.orderPizza(”Veggie”);
我们可以看到,我们将原本放在工厂中实现的创建pizza操作,放回到了PizzaStore里,我们现在只需要以PizzaStore为父类,让每个区域的不同pizza店继承,各自实现createPizza()方法就行。createPizza() 方法是个抽象方法,所有任何具体的加盟店必须实现这个方法,从而个性化加盟 店的披萨风味。例如,NYPPizzaStore的实现。
- public abstract class PizzaStore {
- public Pizza OrderPizza(String type) {
- Pizza pizza;
- // createPizza()方法从工厂对象中回到PizzaStore
- pizza = createPizza(type);
- pizza.prepare();
- pizza.bake();
- pizza.cut();
- pizza.box();
- return pizza;
- }
- // PizzaStore里的工厂方法是抽象的
- abstract Pizza createPizza(String type);
- }
- public class NYPizzaStore extends PizzaStore {
- @Override
- Pizza createPizza(String type) {
- if (type.equals(”cheese”)) {
- return new NYStyleCheesePizza();
- } else if (type.equals(”veggie”)) {
- return new NYStyleVeggiePizza();
- } else if (type.equals(”other”)) {
- // other type.
- } else
- return null;
- }
- }
File: Provider.java
- package ouc.cs.course.java.test.abstractfactory;
- public interface Sender {
- public void Send();
- }
File: MailSender.java
- package ouc.cs.course.java.test.abstractfactory;
- public interface Provider {
- public Sender produce();
- }
File: SmsSender.java
- package ouc.cs.course.java.test.abstractfactory;
- public class MailSender implements Sender {
- public void Send() {
- System.out.println(”this is mailsender ! ”);
- }
- }
File: SendMailFactory.java
- package ouc.cs.course.java.test.abstractfactory;
- public class SmsSender implements Sender {
- public void Send() {
- System.out.println(”this is smssender ! ”);
- }
- }
File: SendSmsFactory.java
- package ouc.cs.course.java.test.abstractfactory;
- public class SendMailFactory implements Provider {
- @Override
- public Sender produce() {
- return new MailSender();
- }
- }
File: Test.java
- package ouc.cs.course.java.test.abstractfactory;
- public class SendSmsFactory implements Provider {
- @Override
- public Sender produce() {
- return new SmsSender();
- }
- }
当你想要扩展产品种类时,只需要增加对应的工厂类和产品类即可,比如我要增加一个QQSender类,只需要新建一个QQSender类实现Sender接口和SendQQFactory类实现Provider接口即可扩展产品种类。
- package test.abstractfactory;
- import ouc.cs.course.java.test.abstractfactory.Provider;
- import ouc.cs.course.java.test.abstractfactory.SendMailFactory;
- import ouc.cs.course.java.test.abstractfactory.Sender;
- public class Test {
- public static void main(String[] args) {
- Provider provider = new SendMailFactory();
- Sender sender = provider.produce();
- sender.Send();
- }
- }
来源: http://www.cnblogs.com/FZfangzheng/p/7732381.html