定义

​ 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。这里强调一下,工厂方法包括:简单工厂模式,和工厂方法模式等一些系列的工厂方法模式的变形。

案例

​ 现在有两个产品,一个是手机,一个是电脑。手机和电脑都是不同的生产商生产的。我们要实现一个工厂管理系统,记录华为和苹果着两家工厂生产的手机和电脑信息。

​ 已知,华为和苹果都有自己的工厂,华为的叫做华为工厂,苹果的叫做苹果工厂。华为工厂生产华为手机和华为电脑。苹果工厂生产苹果手机和苹果电脑。用抽象工厂模式实现改系统,他的设计图如 图一:Java设计模式从精通到入门五 抽象工厂方法模式-LMLPHP

代码如下

Factory类:

/**
* @InterfaceName Factory
* @Description 抽象工厂
* @Author ouyangkang
* @Date 2019-01-19 11:25
**/
public interface Factory {
   /**
    * @Author ouyangkang
    * @Description 生产手机
    * @Date 11:25 2019/1/19
    * @param
    * @return com.设计模式.factory.abstractfactory.Phone
   **/
   Phone createPhone();
   /**
    * @Author ouyangkang
    * @Description 生产电脑
    * @Date 11:26 2019/1/19
    * @param
    * @return com.设计模式.factory.abstractfactory.Computer
   **/
   Computer createComputer();
}

IphoneFactory类

/**
 * @ClassName IphoneFactory
 * @Description 苹果厂商之生产苹果的产品
 * @Author ouyangkang
 * @Date 2019-01-19 11:36
 **/
public class IphoneFactory implements Factory{
    @Override
    public Phone createPhone() {
        return new Iphone();
    }

    @Override
    public Computer createComputer() {
        return new IphoneComputer();
    }
}

HuaWeiFactory类

/**
 * @ClassName HuaWeiFactory
 * @Description TODO
 * @Author ouyangkang
 * @Date 2019-01-19 11:37
 **/
public class HuaWeiFactory implements Factory {
    @Override
    public Phone createPhone() {
        return new HuaWeiIphone();
    }

    @Override
    public Computer createComputer() {
        return new HuaWeiComputer();
    }
}

Phone类

/**
 * @InterfaceName Phone
 * @Description 手机接口
 * @Author ouyangkang
 * @Date 2019-01-19 11:21
 **/
public interface Phone {
    /**
     * @Author ouyangkang
     * @Description 手机生产商
     * @Date 11:23 2019/1/19
     * @param
     * @return void
    **/
    void name();
    /**
     * @Author ouyangkang
     * @Description 通信功能
     * @Date 11:22 2019/1/19
     * @param
     * @return void
    **/
    void communication();
}

Iphone类

/**
 * @ClassName Iphone
 * @Description TODO
 * @Author ouyangkang
 * @Date 2019-01-19 11:27
 **/
public class Iphone implements Phone {
    @Override
    public void name() {
        System.out.println("苹果手机");
    }

    @Override
    public void communication() {
        System.out.println("用苹果手机进行通信");
    }
}

HuaWeiPhone类


/**
 * @ClassName HuaWeiPhone
 * @Description TODO
 * @Author ouyangkang
 * @Date 2019-01-19 11:33
 **/
public class HuaWeiPhone implements Phone {
    @Override
    public void name() {
        System.out.println("华为手机");
    }

    @Override
    public void communication() {
        System.out.println("用华为手机进行通信");
    }
}

Computer类

/**
 * @InterfaceName Computer
 * @Description 电脑
 * @Author ouyangkang
 * @Date 2019-01-19 11:23
 **/
public interface Computer {
    /**
     * @Author ouyangkang
     * @Description 电脑生产商
     * @Date 11:24 2019/1/19
     * @param
     * @return void
    **/
    void name();

    /**
     * @Author ouyangkang
     * @Description 上网
     * @Date 11:24 2019/1/19
     * @param
     * @return void
    **/
    void surf();
}

HuaWeiComputer类和IPhoneComputer类和上面HuaWeiIphone和Iphone类似代码就不重复了。
Client类

public class Client {
    public static void main(String[] args) {
        //苹果厂商
        Factory iphoneFactory = new IphoneFactory();

        Computer iphoneFactoryComputer = iphoneFactory.createComputer();
        iphoneFactoryComputer.name();
        iphoneFactoryComputer.surf();

        System.out.println("--------------------------");
        Phone phone = iphoneFactory.createPhone();
        phone.name();
        phone.communication();


        System.out.println("--------------------------");

        // 华为厂商
        Factory huaWeiFactory = new HuaWeiFactory();

        Computer huaWeiFactoryComputer = huaWeiFactory.createComputer();
        huaWeiFactoryComputer.surf();
        huaWeiFactoryComputer.name();

        System.out.println("--------------------------");

        Phone huaWeiPhone = huaWeiFactory.createPhone();
        huaWeiPhone.communication();
        huaWeiPhone.name();
    }
}

运行得到结果

苹果电脑
用苹果电脑上网
--------------------------
苹果手机
用苹果手机进行通信
--------------------------
用华为电脑上网
华为电脑
--------------------------
用华为手机进行通信
华为手机

总结

​ 上面得简单UML类图我用Visual Paradigm 15.2划了好久,想起了学校外教教我们画这个得时候,后悔当初学得不好,现在只能自己慢慢摸索。

​ 抽象工厂从定义上是很好理解的,为创建一组相关得或者相互依赖得对象提供一个接口,无需指定一个具体得类。一开始自己对于抽象工厂和工厂方法模式总是混淆,但是如果咬文嚼字得看这个两个设计模式得定义得话,然后看代码还是很好区别得。如果你看到一个Factory只有定义一个实例化子类得接口,那么你就可以认为它是工厂方法模式,如果你看到一个Factory中定义了多个实例化子类的不同接口的话,那么他就是抽象工厂方法。

01-23 20:59