整体介绍

◆介绍设计模式 ◆介绍工厂模式的用途与特点 ◆掌握工厂模式的项目应用

设计模式

◆设计模式是前辈总结的设计经验,主要为面向对象语言服务 ◆设计模式的目标是代码更容易理解,更容易维护 ◆通过设计模式可以让代码更加可

设计模式的分类

◆创建型模式 ◆结构型模式 ◆行为型模式

工厂模式

创建型模式中最重要最基本的模式-工厂模式

◆工厂模式用于隐藏创建对象的细节 ◆工厂模式核心:工厂类(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());
    }
}