java 生产设计模式_java设计模式-工厂模式

模式导读:

在现实生活中,我们可能会有过这样一种经历,我想要一台笔记本电脑,但是平常对在实体店里面的笔记本电脑价格不太满意,然后我们就想着去进货的厂里面找,我们不需要关注我们要买的笔记本电脑是怎样生产的,我们只需要一手交钱,一手交货就可以了。这便是工厂方法适用的一种场景,它让我们不需要去关注产品的生产,只需要知道自己需要这种产品即可。

工厂模式:实现了创建者和调用者的分离。

核心本质:

实例化对象,用工厂方法代替new操作;

将选择实现类,创建对象统一管理和控制,从而将调用者和实现类解耦。

分类:

简单工厂模式:也叫静态工厂模式,一般使用静态方法,通过接受的参数的不同返回不同的对象实例,用来生产同意同一等级结构中的任意产品。对于增加新的产品,需要修改已有的代码,违反了开闭原则。

工厂方法模式:用来生产同一等级结构中的固定产品。支持增加任意产品。

抽象工厂模式:用来生产不同产品族的全部产品,不能增加新的产品,支持增加产品族。

简单工厂模式与工厂模式的区别:

简单工厂模式只有一个(对于一个项目或者一个独立的模块而言)工厂类,而工厂模式有一组实现了相同接口的工厂类。

一:简单工厂模式:

参考类图:

7abc9d7e284e390de3e885f7af771c14.png

代码实现:

1.抽象产品类,并提供一个抽象方法用于信息显示

1 packagecom.etc.simplefactory;2

3 public interfaceComputer {4 //定义一个抽象的产品类并给它一个信息显示的方法

5 voidshowMessage();6 }

2.具体的产品类,实现抽象产品类

1 packagecom.etc.simplefactory;2

3 public class Lenveno implementsComputer {4 public doubleprice;5

6 public Lenveno(doubleprice) {7 this.price=price;8 }9 @Override10 public voidshowMessage() {11 System.out.println("这是一台价格为:"+price+"的联想电脑!");12 }13

14 }

1 packagecom.etc.simplefactory;2

3 public class Apple implementsComputer {4 public doubleprice;5

6 public Apple(doubleprice) {7 this.price=price;8 }9

10 @Override11 public voidshowMessage() {12 System.out.println("这是一台价格为:"+price+"的苹果电脑!");13

14 }15

16 }

3.产品工厂类,提供创建产品的方法

1 packagecom.etc.simplefactory;2

3 //电脑制造商,制造特定的产品

4 public classComputerFactory {5 //制造联想电脑

6 public staticComputer createComputer(String msg) {7 if(msg.equals("联想电脑")) {8 return new Lenveno(3900);9 }10 if(msg.equals("苹果电脑")) {11 return new Apple(8500);12 }13 else

14 return null;15 }16 }

4.客户端类,提出需求,给出产品信息

1 packagecom.etc.simplefactory;2

3 public classClient {4

5 public static voidmain(String[] args) {6 //客户需要联想电脑

7 Computer lenveno=ComputerFactory.createComputer("联想电脑");8 lenveno.showMessage();9 //客户需要苹果电脑

10 Computer apple=ComputerFactory.createComputer("苹果电脑");11 apple.showMessage();12

13 }14

15 }

效果截图:

306d304ddf7869e7396b22db19c34fbc.png

二:工厂方法模式:

参考类图:

edb46c37fdbc5046fa6eef3ac97f1567.png

代码实现:

1.抽象产品类,并提供一个抽象方法用于信息显示

1 packagecom.etc.simplefactory;

2

3 public interfaceComputer {

4 //定义一个抽象的产品类并给它一个信息显示的方法

5 voidshowMessage();

6 }

2.具体的产品类,实现抽象产品类

1 packagecom.etc.simplefactory;

2

3 public class Lenveno implementsComputer {

4 public doubleprice;

5

6 public Lenveno(doubleprice) {

7 this.price=price;

8 }

9 @Override

10 public voidshowMessage() {

11 System.out.println("这是一台价格为:"+price+"的联想电脑!");

12 }

13

14 }

1 packagecom.etc.simplefactory;

2

3 public class Apple implementsComputer {

4 public doubleprice;

5

6 public Apple(doubleprice) {

7 this.price=price;

8 }

9

10 @Override

11 public voidshowMessage() {

12 System.out.println("这是一台价格为:"+price+"的苹果电脑!");

13

14 }

15

16 }

3.定义抽象工厂接口,里面定义抽象产品创建方法

1 packagecom.etc.factory;2

3 //抽象工厂接口

4 public interfaceComputerFactory {5 //产品生产抽象方法

6 publicComputer createComputer(String msg);7

8 }

4.具体的工厂类,创建对应的产品

1 packagecom.etc.factory;2 //具体的联想电脑生产工厂

3 public class LenvenoFactory implementsComputerFactory {4

5 @Override6 publicComputer createComputer(String msg) {7 if(msg.equals("联想电脑")) {8 return new Lenveno(4500);9 }10 else

11 return null;12 }13 }

1 packagecom.etc.factory;2 //苹果电脑具体生产工厂

3 public class AppleFactory implementsComputerFactory {4

5 @Override6 publicComputer createComputer(String msg) {7 if(msg.equals("苹果电脑")) {8 return new Apple(9600);9 }10 else

11 return null;12 }13

14 }

5.客户端类,根据用户需求给定特定工厂的特定产品

1 packagecom.etc.factory;2

3 public classClient {4

5 public static voidmain(String[] args) {6 //客户需要联想电脑

7 Computer lenveno=new LenvenoFactory().createComputer("联想电脑");8 lenveno.showMessage();9 //客户需要苹果电脑

10 Computer apple=new AppleFactory().createComputer("苹果电脑");11 apple.showMessage();12 }13

14 }

效果截图:

1fc89b9d2b7ec464b1b03e951ba12a99.png

工厂模式优缺点:

优点:

1、一个调用者想创建一个对象,只要知道其名称就可以了。

2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

适用场景:

1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。

2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。

3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值