设计模式三:工厂方法模式

疑惑解答:
1.interface接口不能够实例化(new),但是可以定义引用来指向继承该接口的实体类;
如:
interface animal{
     void eat();
}
 
class Cat implements animal{
     public void eat(){
          System.out.println("The cat eat!");
     }
}
 
animal an = new Cat();

一.什么是工厂方法模式
     1.是简单工厂模式的进一步抽象;
     2.定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
     3.核心工厂类不再负责产品的创建,是一个抽象工厂角色,仅负责声明工厂子类必须实现的方法。
     4.而所有的工厂之类都必须实现这个抽象工厂,并且每种产品都有一一对应的工厂子类负责产品的创建(实例化);
二.工厂方法模式的角色
产品:
     1.产品父类或者接口: 具体产品的共同父类或接口。
     2.具体产品类:具体的产品;工厂进行实例化的目标;
工厂:
     1.抽象工厂(接口): 是工厂方法模式的核心。任何工厂子类都必须实现这个接口;
     2.具体产品工厂:与具体的产品一一对应,负责创建具体产品的实例。
三.类图
    
四.深入分析
     1.工厂方法模式相对于简单工厂模式而言,最大的特点是:将选择判断创建实例的权利交给了客户端。而不是一个统一的工厂。因此其在实现上克服了简单工厂违反“开方--封闭”的缺陷,实现了可扩展。
     2. 工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具 体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体 的工厂就负责生产对应的产品。
    3.应用场景:
          a. 对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
          b. 只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
 
五.代码
 
class Product{
     int num;      
     int price;
}
 
// 具体产品
class ProductA extends Product{
     public void setNum(int num){
          num = num;
     }
     public void setName(String name){
          name = name;
     }
}
 
class ProductB extends Product{
     public void setNum(int num){
          num = num;
     }
     public void setName(String name){
          name = name;
     }
}   
 
//抽象工厂类
interface Factory{
     Product creatProduct();
}
 
class ProductAFactory implemnets Factory{
     public Product creatProduct(){
         return  new ProductA();
     }
}
 
class ProductBFactory implements Factory{
     public Product creatProduct(){
     return new ProductB();
     }
}
----------------------------------------
客户端代码:
Factory factory = new ProductAFactory();
Product product = factory.creatProduct();  //生产出具体的产品
posted @ 2015-03-07 22:26  北极星之光  阅读(136)  评论(0编辑  收藏  举报