整体介绍
◆介绍设计模式 ◆介绍工厂模式的用途与特点 ◆掌握工厂模式的项目应用
设计模式
◆设计模式是前辈总结的设计经验,主要为面向对象语言服务 ◆设计模式的目标是代码更容易理解,更容易维护 ◆通过设计模式可以让代码更加可
设计模式的分类
◆创建型模式 ◆结构型模式 ◆行为型模式
工厂模式
创建型模式中最重要最基本的模式-工厂模式
◆工厂模式用于隐藏创建对象的细节 ◆工厂模式核心:工厂类(Factory) ◆工厂模式可细分为简单工厂、工厂方法与抽象工厂
简单工厂
新建一个maven工程,新建电脑店com.imooc.factory.computershop
客户买电脑,有多种多样的电脑,需要根据自己需求定制,所以需要导播员这个接口进行引导
新建一个电脑接口抽象类Computer.java 每种电脑有描述信息,新建方法describe(),只定义,不实现
package com.imooc.factory.computershop;
public interface Computer {
public String describe();
}
同理,新建台式电脑类Desktop.java,实现接口方法
package com.imooc.factory.computershop;
public class Desktop implements Computer{
@Override
public String describe() {
return "联想I9/RTX3080/台式游戏主机";
}
}
继续笔记本电脑类Notebook.java
package com.imooc.factory.computershop;
public class Notebook implements Computer{
@Override
public String describe() {
return "华为MateBook14超轻薄办公商务本";
}
}
还有服务器类Server.java
package com.imooc.factory.computershop;
public class Server implements Computer{
@Override
public String describe() {
return "Intel Xeon32核64线程/256G内存/高性能塔式服务器";
}
}
其它电脑类Other.java
package com.imooc.factory.computershop;
public class Other implements Computer{
@Override
public String describe() {
return "DIY客制化电脑";
}
}
我们需要一位店员,对电脑的需求和电脑的种类了如指掌 新建shopAssistant.java 编写suggest类
package com.imooc.factory.computershop;
public class shopAssistant {
public Computer suggest(String purpose) {
Computer computer = null;
if (purpose.equals("网站建设")) {
return new Server();
} else if (purpose.equals("游戏")) {
return new Desktop();
} else if (purpose.equals("办公")) {
return new Notebook();
} else {
return new Other();
}
}
}
这时来了一位顾客,新建Customer类 顾客不需要掌握每一种商品的详细特性,只需面向销售员shopAssistant即可
package com.imooc.factory.computershop;
public class Customer {
public static void main(String[] args){
shopAssistant shopAssistant = new shopAssistant ();//不是静态工厂,需要先实例化,才能访问
Computer c = shopAssistant.suggest ("办公");
System.out.println(c.describe());
}
}
顾客不用知道c是什么种类,只需询问销售员,所有电脑由Computer接口定义,返回Computer即可
返回结果:
华为MateBook14超轻薄办公商务本
Process finished with exit code 0
项目应用-i18n国际化
不同网站在不同地区显示不同语言,这是经典的工厂模式案例 i18n全称internationalization,i到n之间有18个单词 我们要知道,只要出现了工厂模式,必然需要一个顶级接口类 新建Language接口类,新建方法getTitle();
package com.imooc.factory.i18n;
public interface Language {
public String getTitle();
}
新建Chinese实现类
package com.imooc.factory.i18n;
public class Chinese implements Language{
@Override
public String getTitle() {
return "谷歌";
}
}
同理English类
package com.imooc.factory.i18n;
public class English implements Language{
@Override
public String getTitle() {
return "Google";
}
}
我们这时如果一个程序员开发一个app,不是和语言创建者是同一个程序员,进行语言切换时是没必要了解各种语言具体实现,我们只需要新建一个工厂类I18NFactory.java 新建App类 输入psvm快速创建main函数 在I18NFactory文件下:
约定俗成,如果后缀有Factory单词,可以认定为工厂类
package com.imooc.factory.i18n;
public class I18NFactory {
// 静态工厂 不需实例化就可以访问
public static Language getI18NObject(String area){
if(area.equals("china")){
return new Chinese();
}
if(area.equals("english")){
return new English();
}else{
return null;
}
}
}
在App中调用接口
package com.imooc.factory.i18n;
public class App {
public static void main(String[] args) {
Language language = I18NFactory.getI18NObject ("china");
System.out.println(language.getTitle());
}
}