设计模式(二)---工厂方法模式

1、简介:工厂方法模式是类的创建模式,又叫虚拟构造子模式或是多态性工厂模式,它的实现方式是创建一个工厂接口,将实际创建对象的的工作转移到工厂子类中,在系统的扩展中,可以在不修改工厂角色的情况下引进新的产品。

2、工厂方法模式UML

  

3、工厂方法模式情景示意性类图

4、类图分析

  从以上两个图可以看出,工厂方法模式涉及到以下四个角色

  4、1:抽象工厂:担任这个角色的是工厂方法模式的核心,它与应用无关,任何在模式中创建对象的工厂都必须实现这个接口,在实际应用中,这个角色由java抽象类或接口来实现

  4、2:具体工厂:担任这个角色的是抽象工厂的具体实现类,具体工厂含有业务逻辑,并受到客户端的调用创建产品对象,这个角色由java类来实现。

  4、3:抽象产品:这个角色是工厂方法模式创建的对象的超类型(父类),在实际应用中,由java抽象类或是接口来实现

  4、4:具体产品:这个角色实现了抽象产品角色声明的接口,工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。

5、源代码

  5.1:创建一个商品接口

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: ProductInterface 
* @Description: 产品接口,所有产品都必须实现此接口
*  
**********************************************************
 */
public interface Product {
        public void say();
}

  5.2:创建一个食品类 实现商品接口

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: Food 
* @Description: 食品类 
*  
**********************************************************
 */
public class Food implements Product{
    @Override
    public void say() {
        System.out.println("我是食品");
    }
}

  5.3:创建一个水果类 实现商品接口

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: Fruits 
* @Description: 水果类 
*  
**********************************************************
 */
public class Fruits  implements Product{

    @Override
    public void say() {
        System.out.println("我是水果");
    }
}

  5.4:创建工厂接口,所有具体工厂角色必须实现这个接口

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: FactoryInterface 
* @Description: 工厂接口,所有具体工厂角色必须实现此接口 
*  
**********************************************************
 */
public interface FactoryInterface {
    public Product factory();
}

  5.5:创建食品工厂类,实现工厂接口

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: FoodFactory 
* @Description: 食品工厂类
*  
**********************************************************
 */
public class FoodFactory implements FactoryInterface{

    @Override
    public Product factory() {
        // TODO Auto-generated method stub
        return new Food();
    }
}

  5.6:创建水果工厂类,实现工厂接口

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: FruitsFactory 
* @Description: 水果工厂类
*  
**********************************************************
 */
public class FruitsFactory implements FactoryInterface{

    @Override
    public Product factory() {
        // TODO Auto-generated method stub
        return new Fruits();
    }

}

  5.7:创建工厂方法模式测试客户端

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: FactoryMethodTest 
* @Description: 工厂方法模式测试类
*  
**********************************************************
 */
public class FactoryMethodTest {

    public static void main(String[] args) {
        //获取食品工厂对象
        FactoryInterface foodFactory = new FoodFactory();
        //获取水果工厂对象
        FactoryInterface fruitsFactory = new FruitsFactory();
        //获取食品对象
        Product food = foodFactory.factory();
        //获取水果对象
        Product fruits =fruitsFactory.factory();
        //调用对象中的方法
        food.say();
        fruits.say();
    }

}

  5.8:运行,得到如下结果

原文地址:https://www.cnblogs.com/shun-gege/p/7451992.html