设计模式学习之工厂方法模式
工厂方法模式
工厂方法模式定义:Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.
(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类)
工厂方法模式使用场景:
- 工厂方法模式是new一个对象的代替品,所以在使用需要生成对象的地方都可以使用,但是需要慎重地考虑是否要增加一个工厂类进行管理,增加代码的复杂度。
- 需要灵活的、可扩展的框架时,可以考虑工厂方法模式。
- 工厂方法模式可以使用在异构项目中。
- 工厂方法模式可以用在测试驱动开发的框架下。
工厂方法模式的优点:
- 具有良好的封装性,代码结构清晰。一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道类名就可以,不需要知道创建对象的过程,降低模块之间的耦合。
- 工厂方法模式的扩展性非常优秀。
- 工厂方法模式是典型的解耦框架。
废话少说,上代码:
/** * @author Lin * @Date 2017/11/16.
* @Description 定义人类总称 人有不同的肤色,讲不同的语言 */ public interface Human { /** *每个人种的肤色 */ void getCoor(); /** * 说话 */ void talk(); }
接下来定义三个人种,分别为黑人 白人 黄种人
/** * @author Lin * @Date 2017/11/16.
*/ public class BlackHuman implements Human { @Override public void getCoor() { System.out.println("黑色人种皮肤颜色是黑色的"); } @Override public void talk() { System.out.println("黑人会说鬼话。。。"); } } /** * @author Lin * @Date 2017/11/16. */ public class WhiteHuman implements Human { @Override public void getCoor() { System.out.println("白色人种皮肤颜色是白色的"); } @Override public void talk() { System.out.println("白色人种会说话,一般说的都是单字节。"); } } /** * @author Lin * @Date 2017/11/16. */ public class YellowHuman implements Human { @Override public void getCoor() { System.out.println("黄色人种皮肤颜色是黄色的"); } @Override public void talk() { System.out.println("黄色人种会说话,一般说的都是双字节。"); } }
三个人种定义完了,接下来需要定义制人工厂了
/** * @author Lin * @Date 2017/11/16. * @Descrition 抽象人类创建工厂 */ public abstract class AbstractHumanFactory { public abstract <T extends Human> T createHuman(Class<T> c); } /** * @author Lin * @Date 2017/11/16. */ public class HumanFactory extends AbstractHumanFactory{ @Override public <T extends Human> T createHuman(Class<T> c) { //定义一个生产的人钟 Human human = null; try{ human = (T)Class.forName(c.getName()).newInstance(); }catch (Exception e){ System.out.println("人种生成错误"); } return (T) human; } }
制人工厂有了,那最后就是生产了。
/** * @author Lin * @Date 2017/11/16. */ public class NvWa { public static void main(String[] args) { //声明创建一个人类工厂 AbstractHumanFactory factory = new HumanFactory(); System.out.println("---创造出第一批白色人种---"); Human whiteHuman = factory.createHuman(WhiteHuman.class); whiteHuman.getCoor(); whiteHuman.talk(); System.out.println("---创造出第二批黑色人种---"); Human blackHuman = factory.createHuman(BlackHuman.class); blackHuman.getCoor(); blackHuman.talk(); System.out.println("---创造出第三批黄色人种---"); Human yellowHuman = factory.createHuman(YellowHuman.class); yellowHuman.getCoor(); yellowHuman.talk(); } }