qiuxx404

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

1 为什么需要工厂模式?

以类Clothes为例,如果我们要创建Clothes的实例对象:

Clothes clothes = new Clothes();

这是一个简单的new的过程,而当我们需要进行一些相关的初始化工作时(比如赋值),我们可以使用Clothes的构造函数,

Clothes clothes = new Clothes(..);

但是,初始化工作有可能是一个相当复杂的过程,仍然使用构造函数,那可能会是很难看的一段长的代码,就需要Refactor重构。

为什么说代码很难看,初学者可能没有这种感觉,我们分析如下,初始化工作如果是很长一段代码,说明要做的工作很多,
将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有悖于Java面向对象的原则, 面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装”起来(减少段和段之间耦合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。

2 简单工厂模式:

  •   1) 定义一个Clothes接口,具体的(如Suit)实现类实现Clothes内部方法,达到封装的效果(减少因为修改了部分内容而造成重大事故的几率)。
  •   2) 抛弃以往的直接new Clothes()的方式,定义一个Factory类,在内部定义createClothes方法,通过Factory类去制造衣服。

3 具体实现代码

3.1 定义Clothes接口

/**
 * @Description: 服装 父类接口
 * @Author: qiuxx
 * @Date: 22:10 2018/6/17
 */
public interface Clothes {

    /**
     * 衣服名称
     */
    public void clothingCategory();

    /**
     * 适用场合
     */
    public void applicableOccasion();
}

3.2 实现类Suit、DownJackets、Sportswear

/**
 * @Description: 西装
 * @Author: qiuxx
 * @Date: 22:16 2018/6/17
 */
public class Suit implements Clothes {

    @Override
    public void clothingCategory() {
        System.out.println("类别:西装");
    }

    @Override
    public void applicableOccasion() {
        System.out.println("适合商务洽谈、重要会议等");
    }
}

/**
 * @Description: 羽绒服
 * @Author: qiuxx
 * @Date: 22:16 2018/6/17
 */
public class DownJackets implements Clothes {


    @Override
    public void clothingCategory() {
        System.out.println("类别:羽绒服");
    }

    @Override
    public void applicableOccasion() {
        System.out.println("适合寒冷的冬季,保暖、抗寒");
    }
}

/**
 * @Description: 运动衣
 * @Author: qiuxx
 * @Date: 22:16 2018/6/17
 */
public class Sportswear implements Clothes {

    @Override
    public void clothingCategory() {
        System.out.println("类别:运动衣");
    }

    @Override
    public void applicableOccasion() {
        System.out.println("适合运动时间穿着");
    }
}

4 制造衣服的工厂类ClothesFactory

/**
 * @Description: 服装工厂
 * @Author: qiuxx
 * @Date: 22:25 2018/6/17
 */
public class ClothesFactory {

    //定义一个制衣厂,将衣服类型传入,便制造出了衣服
    public static Clothes createClothes(Class c) {
        Clothes clothes = null;
        try {
            clothes = (Clothes) Class.forName(c.getName()).newInstance();//制造一件衣服
            return clothes;
        } catch (InstantiationException e) {
            System.out.println("必须指定好衣服类型");
        } catch (IllegalAccessException e) {
            System.out.println("衣服类型指定有误");
        } catch (ClassNotFoundException e) {
            System.out.println("指定衣服类型找不到");
        }
        return clothes;
    }
}

5 调用方Caller

/**
 * @Description:  调用方(main方法)
 * @Author: qiuxx
 * @Date: 22:04 2018/6/17
 */
public class Caller {

    public static void main(String[] args){
        System.out.println("------------生产西装--------");
        Clothes suit = ClothesFactory.createClothes(Suit.class);
        suit.clothingCategory();
        suit.applicableOccasion();

        System.out.println("------------生产羽绒服--------");
        Clothes downJackets = ClothesFactory.createClothes(DownJackets.class);
        downJackets.clothingCategory();
        downJackets.applicableOccasion();

        System.out.println("------------生产运动衫--------");
        Clothes sportswear = ClothesFactory.createClothes(Sportswear.class);
        sportswear.clothingCategory();
        sportswear.applicableOccasion();
    }
}

相关文章: