这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。这里强调一下,工厂方法包括:简单工厂模式,和工厂方法模式等一些系列的工厂方法模式的变形。
案例 现在有两个产品,一个是手机,一个是电脑。手机和电脑都是不同的生产商生产的。我们要实现一个工厂管理系统,记录华为和苹果着两家工厂生产的手机和电脑信息。
已知,华为和苹果都有自己的工厂,华为的叫做华为工厂,苹果的叫做苹果工厂。华为工厂生产华为手机和华为电脑。苹果工厂生产苹果手机和苹果电脑。用抽象工厂模式实现改系统,他的设计图如 图一:
图一 代码如下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类
运行得到结果
苹果电脑 用苹果电脑上网 -------------------------- 苹果手机 用苹果手机进行通信 -------------------------- 用华为电脑上网 华为电脑 -------------------------- 用华为手机进行通信 华为手机 总结 上面得简单UML类图我用Visual Paradigm 15.2划了好久,想起了学校外教教我们画这个得时候,后悔当初学得不好,现在只能自己慢慢摸索。