查看: 253|回复: 0

设计模式 – 工厂模式

[复制链接]

3

威望

8

金钱

16

积分

新手上路

Rank: 1

积分
16
QQ
发表于 2019-3-14 15:21:00 | 显示全部楼层 |阅读模式

    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • 工厂方法模式一种创建对象的模式,它被广泛应用在jdk中以及Spring和Struts框架中;
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • 工厂方法模式基于"输入",应用在超类和多个子类之间的情况,这种模式将创建对象的责任转移到工厂类;
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • 首先让我们学习一下如何在Java中应用工厂方法模式并且学习到工厂方法的优点,另外工厂方法模式也广泛应用在jdk中;
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • 超类可以是接口、抽象类、父类,本例中将通过重写 toString() 方法来解释工厂方法模式;
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
实例
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享! package com.journaldev.design.model;public abstract class Computer {public abstract String getRAM();public abstract String getHDD();public abstract String getCPU();@Overridepublic String toString(){return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();}}
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!工厂设计模式子类
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!假设子类 PC 和 Server 实现了 Computer:
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!实例
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享! package com.journaldev.design.model;public class PC extends Computer {private String ram;private String hdd;private String cpu;public PC(String ram, String hdd, String cpu){this.ram=ram;this.hdd=hdd;this.cpu=cpu;}@Overridepublic String getRAM() {return this.ram;}@Overridepublic String getHDD() {return this.hdd;}@Overridepublic String getCPU() {return this.cpu;}}
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!Server 也实现了 Computer:
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!实例
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享! package com.journaldev.design.model;public class Server extends Computer {private String ram;private String hdd;private String cpu;public Server(String ram, String hdd, String cpu){this.ram=ram;this.hdd=hdd;this.cpu=cpu;}@Overridepublic String getRAM() {return this.ram;}@Overridepublic String getHDD() {return this.hdd;}@Overridepublic String getCPU() {return this.cpu;}}
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!工厂类
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!现在有了多个子类和超类,接下来可以创建工厂类了:
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!实例
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享! package com.journaldev.design.factory;import com.journaldev.design.model.Computer;import com.journaldev.design.model.PC;import com.journaldev.design.model.Server;public class ComputerFactory {public static Computer getComputer(String type, String ram, String hdd, String cpu){if("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu);else if("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu);return null;}}
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!需要重点指出的是:
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!

    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • 工厂类可以是单例的,getComputer 可以是静态的;
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • getComputer 是工厂类的方法,且基于相同的参数类型返回了不同的对象;
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!

乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!接下来是一个简单的测试客户端程序,它使用上面的工厂设计模式实现。
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!实例
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享! package com.journaldev.design.test;import com.journaldev.design.abstractfactory.PCFactory;import com.journaldev.design.abstractfactory.ServerFactory;import com.journaldev.design.factory.ComputerFactory;import com.journaldev.design.model.Computer;public class TestFactory {public static void main(String[] args) {Computer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz");Computer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz");System.out.println("Factory PC Config::"+pc);System.out.println("Factory Server Config::"+server);}}
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!输出:
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHzFactory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz工厂设计模式的优点
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!

    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • 面向接口编程,体现了面向对象的思想;
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • 将创建对象的工作转移到了工厂类;
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
JDK 中的工厂设计模式实例
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!

    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • java.util.Calendar, ResourceBundle and NumberFormat getInstance() 使用了工厂方法模式;
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • valueOf() 在包装类中,如Boolean, Integer 也使用了工厂方法模式;
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐阅读 More>
广告位
快速回复 返回顶部 返回列表