专栏首页shimeath的Java学习02 设计模式 工厂模式

02 设计模式 工厂模式

工厂模式

静态工厂

使用工厂前如下图:

在使用静态工厂之前我们创造对象都需要自己使用new关键字进行创建,而使用工厂之后便不需要自己进行创建,直接在工厂中取出成品便可以直接使用,不需要关心创造细节;

例如:我想买一台电脑,在没有工厂的时候我只能自己做,需要什么样的CPU、什么样的内存等等,这些都需要我们自己去配置;而在有了工厂之后便不需要这么麻烦了,我想买电脑,直接去工厂里买就可以,不需要关心是怎么样配置的,只要拿过来就可以直接使用了。

对于消费者来说,可以看到的只有电脑工厂,具体的生产细节对消费者透明

  • 代码如下 电脑类: /*电脑的接口类*/ public interface Computer { public String getComputer(); } /*戴尔的电脑*/ public class DellComputer implements Computer{ @Override public String getComputer() { return "Dell"; } } /*联想的电脑*/ public class LenovoComputer implements Computer{ @Override public String getComputer() { return "Lenovo"; } } 电脑工厂类 public class ComputerFactory { public static Computer getComputer(String brand){ if (brand.equals("戴尔")){ return new DellComputer(); }else if(brand.equals("联想")){ return new LenovoComputer(); } return null; } } 在我想要什么样的电脑直接告诉工厂就可以了,它会给我返回我需要的电脑 public static void main(String[] args) { Scanner in = new Scanner(System.in); String comp; do { System.out.print("输入你要买的电脑(退出输入”exit“):"); comp = in.next(); if (comp.equals("exit")) { break; } System.out.println(ComputerFactory.getComputer(comp).getComputer()); } while (true); }

这个工厂看似很好,但是却有一个问题。那就是在添加品牌的时候,必须改动工厂方法,这样就破坏了开闭原则,这时就需要一种方法来解决这件事情

方法工厂

方法工厂就是在静态工厂的基础上,建立了一个方法工厂;使得每一个类都有一个工厂,在添加类时不会破坏开闭原则

添加新的类时不会影响原有类

代码如下

电脑类:

/*电脑的接口类*/
public interface Computer {
    public String getComputer();
}

电脑类及其工厂

/*戴尔的电脑*/
public class DellComputer implements Computer{
    @Override
    public String getComputer() {
        return "Dell";
    }
}
/*戴尔的工厂*/
public class DellComputerFactory implements ComputerFactory{
    @Override
    public Computer getComputer() {
        return new DellComputer();
    }
}


/*联想的电脑*/
public class LenovoComputer implements Computer{
    @Override
    public String getComputer() {
        return "Lenovo";
    }
}
/*联想的工厂*/
public class LenovoComputerFactory implements ComputerFactory {
    @Override
    public Computer getComputer() {
        return new LenovoComputer();
    }
}

测试类

public static void main(String[] args) {
    Computer computer1 = new DellComputerFactory().getComputer();
    Computer computer2 = new LenovoComputerFactory().getComputer();

    System.out.println(computer1.getName());
    System.out.println(computer2.getName());
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 字节流---复制文件和文件夹

    shimeath
  • 多线程基础

    Java提供了多种多线程锁机制的实现方式,每种机制都有优缺点与各自的适用场景,常见的有:

    shimeath
  • 09 设计模式 动态代理

    之前学习过静态代理,发现有个缺点,每当需要代理一个类就需要创建与之相当的代理类,极大的增加了代码量。现在通过动态代理,可以通过极少的代码量实现所要的功能

    shimeath
  • 单元测试mock当前时间

    在实际项目中很多地方用到DateTime.Now,这个时间是时时变化的。如果要进行单元测试对比预期结果时,这个时间无法预测,可以添加如下两个时间类

    用户6362579
  • 神经网络结构(上)

    深度神经网络和深度学习是很强大和流行的算法。他们的成功很大程度上在于神经网络架构的精心设计。所以我想重温过去几年深度学习的神经网络设计的历史。

    哒呵呵
  • Yii2中的components的使用

    <?php namespace common\components; use yii\base\Component; ...

    botkenni
  • C# dontet Office Open XML Unit Converter

    Here is my code to conver between OpenXML units.

    林德熙
  • 从傅立叶级数到傅立叶变换

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    卡尔曼和玻尔兹曼谁曼
  • IIS服务器文件跨域问题(几乎可以解决大多数跨域问题)

    Windows server 服务器 1:在管理工具中选择,找到IIS ? 2:打开IIS管理,找到网站 ? 3:找到HTTP响应头标 ? 4:打开HTTP响应...

    SpiritLing
  • golang开发环境配置及Beego框架安装

    配置环境:Windows7+ 推荐IDE:LiteIDE GO下载地址:http://www.golangtc.com/download Beego开发文档地址...

    Java中文社群_老王

扫码关注云+社区

领取腾讯云代金券