博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工厂方法模式
阅读量:6281 次
发布时间:2019-06-22

本文共 3189 字,大约阅读时间需要 10 分钟。

工厂方法模式使用频率比较高,其定义为:

工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

一:通用源码
step1:抽象产品类

public abstract class Product{    //产品类的公共方法    public void method1() {        //业务逻辑    }    //抽象方法    public abstract void method2();}

step2:具体产品类

public class ConcreteProduct1 extends Product{    public abstract void method2(); {        //业务逻辑处理    }}public class ConcreteProduct2 extends Product{    public abstract void method2(); {        //业务逻辑处理    }}

step3:抽象工厂类

public abstract class Creator{    /**     * 创建一个产品对象,其输入参数类型可以自行设置,通常为String、Enum、Class等,也可为空     * @param c     * @return     */    public abstract 
T createProduct(Class
c);}

具体如何产生一个产品的对象呢?有具体的工厂类实现。

step4:具体工厂类

public class ConcreteFactory extends Creator {    @Override    public 
T createProduct(Class
c) { //定义一个生产的人种 Product product = null; try { //产生一个人种 product = (T)Class.forName(c.getName()).newInstance(); } catch (Exception e) { //异常处理 } return (T)product; }}

step5:场景类

public class Client{    public static void main(String[] args) {        Creator creator = new ConcreteFactory();        Product product = creator.createProduct(ConcreteProduct1.class);        /*         * 后续业务处理         */    }}

二:使用女娲造人的例子,应用通用模板
step1:抽象产品类

public interface Human {    //每个人种都有颜色    public void getColor();    //每个人种都会说话    public void talk();}

step2:具体产品类(这里只给出一个白色的人)

public class WhiteHuman implements Human {    @Override    public void getColor() {        // TODO Auto-generated method stub        System.out.println("我是白色儿的");    }    @Override    public void talk() {        // TODO Auto-generated method stub        System.out.println("我说的话你听不懂,you know?");    }}

step3:抽象工厂类

//抽象人类创建工厂public abstract class AbstractHumanFactory {    //必须是Class类型,必须是Human的实现类    public abstract 
T createHuman(Class
c);}

step4:具体工厂类

public class HumanFactory extends AbstractHumanFactory {    @Override    public 
T createHuman(Class
c) { //定义一个生产的人种 Human human = null; try { //产生一个人种 human = (T)Class.forName(c.getName()).newInstance(); } catch (Exception e) { System.out.println("人种生成错误"); } return (T)human; }}

step5:场景类

public class NvWa {    //模拟女娲造人的过程    public static void main(String[] args) {        AbstractHumanFactory yinYangLu = new HumanFactory();        //造个白色儿的        Human wHuman = yinYangLu.createHuman(WhiteHuman.class);        wHuman.getColor();        wHuman.talk();        //来个黑小子        Human bHuman = yinYangLu.createHuman(BlackHuman.class);        bHuman.getColor();        bHuman.talk();        //小麦色的亚洲宝宝        Human yHuman = yinYangLu.createHuman(YellowHuman.class);        yHuman.getColor();        yHuman.talk();    }}

三:理解
工厂方法模式使用的比较频繁,他是典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不用关心。符合迪米特法则,我不需要的就不要去交流;符合依赖倒置原则,只依赖产品类的抽象;符合里氏替换原则,使用产品子类替换产品父类。
四:写在后面
设计模式比较抽象,对现在还没工作的我来说的确有点难理解。我现在只能死记硬背,先能认出人家用的是那种设计模式。希望工作后的我能真正理解设计模式的精髓,掌握他的核心!

转载于:https://blog.51cto.com/13416247/2299454

你可能感兴趣的文章
ansible插件之统计任务处理时间
查看>>
新手从Python的哪个版本开始学比较好?
查看>>
linux bash shell中for的用法and示例
查看>>
所有和Java中代理有关的知识点都汇集于此,速进学干货。
查看>>
开机启动的全过程
查看>>
反向教学系列之——PHP入门(一)
查看>>
微会动微信现场互动:会议会展活动运营管理之年会活动管理技巧
查看>>
css规则
查看>>
芯片制造与金融软件开发公司,采用什么样专业数据存储与备份规划方案
查看>>
linux下安装lnmp
查看>>
vue-cli 教程
查看>>
说说用过的几个远程工具
查看>>
开源项目Bug悬赏任务
查看>>
# python如何学习(二)
查看>>
怎么把图片转换成word?
查看>>
c# webbrowser 实现淘宝天猫链接转为淘宝客链接 有源码
查看>>
CentOS Rsync服务端与Windows cwRsync客户端实现数据同步
查看>>
ASM:ORA-15063 错误处理方法一则
查看>>
什么是Oracle高水位线?"high water mark"或HWM详解
查看>>
详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表
查看>>