标签:
工厂方法模式分为三种:
一、普通工厂模式,建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
1、创建公共接口
public interface Fruit { public void showPrice(); }
2、创建产品类,分别为AppleFactory.java和PearFactory.java
public class AppleFactory implements Fruit{ public void showPrice() { System.out.println("$1.1"); } } public class PearFactory implements Fruit{ public void showPrice() { System.out.println("pear price is $0.5"); } }
3、创建工厂类
public class SimpleFactoryMethod { public Fruit produce(String type) { if ("Apple".equals(type)) { return new AppleFactory(); } else if ("Pear".equals(type)) { return new PearFactory(); } else { System.out.println("输入正确的类型 "); return null; } } }
4、最后测试类
public class FactoryTest { public static void main(String[] args) { SimpleFactoryMethod factory = new SimpleFactoryMethod(); Fruit fruit = factory.produce("Apple"); fruit.showPrice(); } }
5、输出结果:$1.1
二、多工厂方法
多工厂方法就是用多个生产产品的方法代替type的分支
public class MultiFactoryMethod { public Fruit produceApple() { return new AppleFactory(); } public Fruit producePear() { return new PearFactory(); } }
三、静态工厂方法模式
将上面的多个工厂方法模式里面的方法设置为静态的,不需要创建工厂实例,直接调用即可。
public class MultiFactoryMethod { public static Fruit produceApple() { return new AppleFactory(); } public static Fruit producePear() { return new PearFactory(); } }
工厂模式适合有大量产品需要创建,并且具有共同接口时,可以通过工厂方法模式创建。以上三种模式中,第一种如果传入的type字符串有误,不能正确的创建对象,第三种相对于第二种就不需要实例化工厂类,故大多数情况下都是用第三种静态工厂方法模式。
四、抽象工厂模式(Abstract Factory)
工厂方法模式有一个问题,类的创建依赖工厂类,如果想拓展产品,必须对工厂类进行修改,这违背了闭包原则,所以抽象工厂模式就诞生了,可以创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
抽象工厂不好理解,其实我们先把抽象工厂分成两个部分:产品、工厂类。上面提到的工厂类就只有一个,里面包含了多个产品的生成,而抽象工厂你可以简单的理解为一个工厂生成一类产品,多个工厂生成多类产品,暂时可以理解工厂类和产品类是一对一的关系。如果这一步理解了,就可以扩展,一个工厂同样可以对应多类产品。
先看看代码,一个工厂类只负责生产一类产品。
产品类:AppleProduct.java和 PearProduct.java
public interface Fruit { public void showName(); }
public class AppleProduct implements Fruit{ public void showName() { System.out.println("i am apple"); } }
public class PearProduct implements Fruit{ public void showName() { System.out.println("i am pear"); } }
工厂类:AppleFactory.java 、PearFactory.java、抽象接口Provider.java
public class AppleFactory implements Provider{ public Fruit produce() { return new AppleProduct(); } }
public class PearFactory implements Provider{ public Fruit produce() { return new PearProduct(); } }
public interface Provider { public Fruit produce(); }
我们看到一个工厂类只生产一个产品类,
测试代码如下:
public class Test { public static void main(String[] args) { Provider provider = new AppleFactory(); Fruit fruit = provider.produce(); fruit.showName(); } }
测试结果:
i am apple
ok,这样理解是不是很easy啦。
标签:
原文地址:http://www.cnblogs.com/speculator/p/5462392.html