白话-23种设计模式1-工厂模式

举报
object 发表于 2022/06/27 16:34:45 2022/06/27
【摘要】 一、白话  假如我有三台笔记本,华硕,联想,苹果。 出外办公的时候,根据对接的公司的不同,于是想使用不同的笔记本,于是去苹果公司,我对秘书妹妹说:“帮我把苹果笔记本打开一下”,去华硕公司,说:“帮我把华硕笔记本打开一下”,去联想公司,说:“帮我把联想笔记本打开一下”。秘书妹妹表示我对她的不信任对我抗议道:“老板,你直接说打开电脑就行了,使用哪台笔记本我知道的”。二、简单工厂模式  简单工厂为...

一、白话

  假如我有三台笔记本,华硕,联想,苹果。 出外办公的时候,根据对接的公司的不同,于是想使用不同的笔记本,于是去苹果公司,我对秘书妹妹说:“帮我把苹果笔记本打开一下”,去华硕公司,说:“帮我把华硕笔记本打开一下”,去联想公司,说:“帮我把联想笔记本打开一下”。秘书妹妹表示我对她的不信任对我抗议道:“老板,你直接说打开电脑就行了,使用哪台笔记本我知道的”。

二、定义

  工厂模式:就是定义了一系列创建对象的接口,访问类不需要提供具体的类就可以得到相应的对象,并对得到的对象加以控制,如个数。

三、简单工厂模式

  简单工厂为最简单的一种工厂模式。共计三个角色:工厂、抽象产品、具体产品

 

    代码展示:

/**
 * 抽象产品角色
 */
public interface INoteBook {
    /**
     * 开机
     */
    public void open();
}
/**
 * 具体产品
 */
public class Asus implements INoteBook {
    public void open(){
        System.out.println("华硕开机...");
    }
}
/**
 * 具体产品
 */
public class Lenovo implements INoteBook {
    public void open(){
        System.out.println("联想开机...");
    }
}
/**
 * 具体产品
 */
public class Mac implements INoteBook {
    public void open(){
        System.out.println("苹果开机...");
    }
}
/**
 * 工厂类角色
 */
public class NotebookFactory {
    public static INoteBook create(String note) {
        if("asus".equals(note)) {
            return new Asus();
        } else if ("lenovo".equals(note)) {
            return new Lenovo();
        } else if ("mac".equals(note)) {
            return new Mac();
        } else {
            throw new RuntimeException("没有此公司");
        }

    }
}
/**
 * 客户端执行
 */
public class FactoryApplication {

    public static void main(String[] args) {
        // 去往哪个公司
        INoteBook asus = NotebookFactory.create("asus");
        // 开机
        asus.open();
    }

}

   最后输出 “华硕开机...”。

  上面完成一套简单工厂模式的演示,我们只需要说开机,就可以完成相应的动作,而不用在意内部细节的不同。更符合设计要求,但是问题也是很明显,过于依赖工厂角色,每当有新的笔记本加入,则需要修改工厂代码,不符合开闭原则,同时,过多的笔记本也会导致工厂依赖过重,出现上帝类情况。针对更为复杂的情况,产品较多的情况,简单工厂就无法满足我们的要求,需要做进一步升级。例如工厂方法模式


四、工厂方法模式

  工厂方法模式也是比较简单,只是在简单工厂的基础上拆分掉具体工厂角色的创建功能,拆分成多个,各个产品有各自的具体工厂角色,增加抽象工厂角色。其实就是使用动态代替了if else的手段。

  白话:因为合作的公司越来越多,秘书携带的笔记本过多,于是跟秘书说,我给你加几个负责人,笔记本让他们带着,你负责管理他们就可以了。

/**
 * 抽象工厂角色
 */
public interface INoteBookFactory {
    public INoteBook creat();
}
/**
 * 华硕具体工厂角色
 */
public class AsusFactory implements INoteBookFactory {
    @Override
    public INoteBook creat() {
        return new Asus();
    }
}
/**
 * 联想具体工厂角色
 */
public class LenovoFactory implements INoteBookFactory {
    @Override
    public INoteBook creat() {
        return new Lenovo();
    }
}
/**
 * 苹果具体工厂角色
 */
public class MacFactory implements INoteBookFactory {
    @Override
    public INoteBook creat() {
        return new Mac();
    }
}

   以上就完成了一次工厂方法模式,利用了多态代替了if else。效果也很明显,工厂职责单独拆分掉。不会导致依赖过重,同时对于新增的产品,只需要继承抽象工厂,产生相应的产品即可。符合开闭原则。但是,也随之产生了问题,由于每个角色都有自己的单独的工厂会导致过多的实现类,导致代码冗余,产生过多的类,这不是所期望看到的。针对更为复杂的场景,于是做升级,例如抽象工厂模式

五、抽象工厂模式

  个人理解,就是在工厂方法基础上有了产品族的一个概念。避免产生过多的实现类,对工厂角色增加相似的功能

  白话:随着业务增多,不仅仅需要笔记本,还有手机。两者功能类似,把两者作为一个产品族的概念,各个负责人需要把自己负责的产品族都带上。为了更好的审美和劳逸结合,新增了一个秘书MM,之前的秘书依旧负责管理这些人,选择哪位负责人进行业务动作,而新来的秘书负责管理产品有哪些业务动作。

  代码演示

/**
 * 抽象产品族概念 数码
 */
public abstract class AbstractDigital {
    public abstract void open();
}
/**
 * 抽象产品角色
 */
public abstract class INoteBook extends AbstractDigital {
    public abstract void open();
}
/**
 * 抽象产品角色
 */
public abstract class IPhone extends AbstractDigital {
    public abstract void open();
}
/**
 * 具体产品角色
 */
public class AsusPhone extends IPhone {
    public void open(){
        System.out.println("华硕手机开机中...");
    }
}
/**
 * 具体产品
 */
public class Asus extends INoteBook {
    public void open(){
        System.out.println("华硕开机...");
    }
}


/**
 * 抽象工厂角色 数码
 */
public interface IDigitalFactoary {
    public INoteBook createNote();
    public IPhone createPhone();
}
/**
 * 华硕具体工厂角色
 */
public class AsusFactory implements IDigitalFactoary {
    @Override
    public INoteBook createNote() {
        return new Asus();
    }
    @Override
    public IPhone createPhone() {
        return new AsusPhone();
    }
}
/**
 * 联想具体工厂角色
 */
public class LenovoFactory implements IDigitalFactoary {
    @Override
    public INoteBook createNote() {
        return new Lenovo();
    }
    @Override
    public IPhone createPhone() {
        return new LenovoPhone();
    }
}

public static void main(String[] args) {
    // 去往哪个公司
    IDigitalFactoary asusFactory = new AsusFactory();
    AbstractDigital note = asusFactory.createNote();
    AbstractDigital phone = asusFactory.createPhone();
    // 开机
    note.open();
    phone.open();
}

  以上,就完成了一次抽象工厂模式的演示。文中是用品牌的方式作为了一个产品族,不一定合适,需要结合业务实际场景,选择最合理的封装,万物皆对象,只有合适的才是最好的。例如可以选择类似的电子产品作为一个产品族。同时抽象工厂模式是应对较为复杂的场景,需要足够多的产品和品牌,用来解决类似的场景,如果业务本身并不复杂,采用更简单的模式或许更好。

  最后,君共勉。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。