java工厂方法模式

意图:定义一个用于创建对象的接口,让子类决定创建那个类。Factory Method使一个类的实例化延迟到其子类中
动机:框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责
适用性:
1.当一个类不知道它所必须创建的对象的类的时候
2.当一个类希望由它的子类来指定它所创建的对象的时候
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将那一个帮助子类是代理者这一信息局部化的时候
结构:

工厂方法的实现主要有两种情况:

1.Creator类是一个抽象类并且不提供它所声明的工厂方法的实现

2.Creator是一个具体的类而且为工厂方法提供一个缺省的实现

实例:

 1 package com.test.patten.factory;
 2 
 3 public abstract class Creator {
 4     public abstract Product productFactory(String type);
 5     
 6     public void doSomething(String type) {
 7         Product product = productFactory(type);
 8         product.getPrice();
 9     }
10 }
1 package com.test.patten.factory;
2 
3 public abstract class Product {
4     double price = 0;
5     public void getPrice() {
6         System.out.println("我的价格是:"+price);
7     }
8 }
1 package com.test.patten.factory;
2 
3 public class GoodProduct extends Product {
4 
5     public GoodProduct() {
6         super();
7         this.price = 100.0;
8     }
9 }
1 package com.test.patten.factory;
2 
3 public class BadProduct extends Product {
4 
5     public BadProduct() {
6         super();
7         this.price = 0.01;
8     }
9 }
 1 package com.test.patten.factory;
 2 
 3 public class ConcreteCreator extends Creator {
 4 
 5     @Override
 6     public Product productFactory(String type) {
 7         Product product = null;
 8         if(type.equals("good")){
 9             product = new GoodProduct();
10         }else if (type.equals("bad")) {
11             product = new BadProduct();
12         }
13         return product;
14     }
15 
16 }

测试一下:

1 package com.test.patten.factory;
2 
3 public class Client {
4     public static void main(String args[]){
5         Creator creator = new ConcreteCreator();
6         creator.doSomething("good");//生产一个好的产品
7         creator.doSomething("bad");//生产一个次品
8     }
9 }
我的价格是:100.0
我的价格是:0.01

应用:工厂方法主要应用于工具包和框架中
设计原则:要依赖抽象,不要依赖具体类-依赖倒置原则

posted @ 2013-02-01 10:22  Gnight  阅读(4866)  评论(0编辑  收藏  举报