菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
178
0

java设计模式

原创
05/13 14:22
阅读数 51160

oop七大原则:

  开闭原则:一个软件的实体应当对扩展开放,对修改关闭

  依赖倒转原则:要针对接口编程,不要针对实现编程

  迪米特法则:只与你直接的朋友通信,而避免和陌生人通信

一、工厂模式

作用:实现了创建者和调用者的分离

核心本质:

  实例化对象不使用new,用工厂方法代替

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

详细分类: 

  简单工厂模式:用来生产同一等级结构中的任意产品(对于增加新的产品,需要覆盖已有代码)

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

  抽象工厂模式:围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂

简单工厂模式

 1 /**
 2  * 接口Car
 3  */
 4 public interface Car {
 5     void name();
 6 }
 7 
 8 class wuling implements Car {
 9     @Override
10     public void name() {
11         System.out.println("五菱宏光");
12     }
13 }
14 
15 class TeSiLa implements Car {
16     @Override
17     public void name() {
18         System.out.println("特斯拉");
19     }
20 }
21 
22 class CatPlant {
23 
24     //简单工厂
25     public static Car getCar(String name){
26         if(name.equals("五菱")){
27             return new wuling();
28         }else if(name.equals("特斯拉")){
29             return new TeSiLa();
30         }else {
31             return null;
32         }
33     }
34 }
35 
36 /**
37  * 主类,消费者类
38  * 简单工厂模式(静态工厂模式)   如果需要增加新的产品,必须修改代码,不符合开闭原则
39  */
40 public class Consumer {
41     public static void main(String[] args) {
42         //通过工厂new对象,
43         Car car1 =  CatPlant.getCar("五菱");
44         Car car2 =  CatPlant.getCar("特斯拉");
45 
46         car1.name();
47         car2.name();
48     }
49 }

工厂方法模式

  相比简单工厂模式,符合开闭原则

  实现:创建两个接口,一个是对象接口,一个工厂接口,通过new工厂接口实例化对象,

     这样做的好处是,增加新类型对象,不需要修改代码,可以随时扩展了

 1 /**
 2  * 接口Car
 3  */
 4 public interface Car {
 5     void name();
 6 }
 7 
 8 
 9 //汽车工厂接口
10 public interface CarPlant {
11 
12     //方法工厂
13      Car getCar();
14 }
15 
16 
17 //五菱汽车实现类
18 public class wuling implements Car {
19     @Override
20     public void name() {
21         System.out.println("五菱宏光");
22     }
23 }
24 
25 
26 //特斯拉汽车实现类
27 public class TeSiLa implements Car {
28     @Override
29     public void name() {
30         System.out.println("特斯拉");
31     }
32 }
33 
34 
35 //五菱工厂
36 public class wulingPlant implements CarPlant{
37     @Override
38     public  Car getCar() {
39         return new wuling();
40     }
41 }
42 
43 
44 //特斯拉工厂
45 public class TeSiLaPlant implements CarPlant{
46     @Override
47     public Car getCar() {
48         return new TeSiLa();
49     }
50 }
51 
52 
53 /**
54  * 主类,消费者类
55  * 简单工厂模式(静态工厂模式)   如果需要增加新的产品,必须修改代码,不符合开闭原则
56  */
57 public class Consumer {
58     public static void main(String[] args) {
59         //通过具体的车辆工厂
60         Car car1 = new TeSiLaPlant().getCar();
61         Car car2 = new wulingPlant().getCar();
62 
63         car1.name();
64         car2.name();
65         //优点:添加车辆不需要修改代码直接新建实现类继承接口,符合开闭原则
66         // (注意新建两个类,一个实现车接口,作为对象,一个实现工厂接口,作为工厂。直接new工厂)
67 
68         //缺点:代码量增大
69     }
70 }

抽象工厂模式

定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类

适用场景:

  客户端(应用层)不依赖于产品实例如何被创建、实现等细节

  强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码

  提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现

优点:

  具体产品在应用层的代码隔离,无需关心创建的细节

  将一个系列的产品统一到一起创建

缺点:

  规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难

  增加了系统的抽象性和理解难度

  

  1 //抽象类:手机,拥有手机的基本功能
  2 public interface Phone {
  3     void note();        //发短信
  4     void callUp();      //打电话
  5 }
  6 
  7 
  8 //游戏机 接口
  9 public interface GameMachine {
 10     void playGame();        //打游戏
 11     void music();           //听音乐
 12 }
 13 
 14 
 15 //抽象接口:新建对象方法
 16 public interface AbstractPlant {
 17     Phone getPhone();               //新建手机
 18     GameMachine getGame();         //新建游戏机
 19 }
 20 
 21 
 22 // 手机实现类:小米手机
 23 public class XiaomiPhone implements Phone {
 24     @Override
 25     public void note() {
 26         System.out.println("小米手机发短信");
 27     }
 28 
 29     @Override
 30     public void callUp() {
 31         System.out.println("小米手机打电话");
 32     }
 33 }
 34 
 35 
 36 //游戏机实现类:小米游戏机
 37 public class XiaomiGame implements GameMachine {
 38     @Override
 39     public void playGame() {
 40         System.out.println("小米游戏机打游戏");
 41     }
 42 
 43     @Override
 44     public void music() {
 45         System.out.println("小米游戏机听音乐");
 46     }
 47 }
 48 
 49 
 50 //小米工厂:生产游戏机,手机
 51 public class XiaomiPlant implements AbstractPlant{
 52 
 53     @Override
 54     public Phone getPhone() {
 55         return new XiaomiPhone();
 56     }
 57 
 58     @Override
 59     public GameMachine getGame() {
 60         return new XiaomiGame();
 61     }
 62 }
 63 
 64 
 65 //手机实现类:华为手机
 66 public class HuaweiPhone implements Phone {
 67     @Override
 68     public void note() {
 69         System.out.println("华为手机发短信");
 70     }
 71 
 72     @Override
 73     public void callUp() {
 74         System.out.println("华为手机打电话");
 75     }
 76 }
 77 
 78 
 79 //游戏机实现类:华为游戏机
 80 public class HuaweiGame implements GameMachine{
 81     @Override
 82     public void playGame() {
 83         System.out.println("华为游戏机打游戏");
 84     }
 85 
 86     @Override
 87     public void music() {
 88         System.out.println("华为游戏机听音乐");
 89     }
 90 }
 91 
 92 
 93 //华为工厂:生产华为手机,华为游戏机
 94 public class HuaweiPlant implements AbstractPlant {
 95     @Override
 96     public Phone getPhone() {
 97         return new HuaweiPhone();
 98     }
 99 
100     @Override
101     public GameMachine getGame() {
102         return new HuaweiGame();
103     }
104 }
105 
106 
107 // 测试类。主方法
108 public class Test {
109     public static void main(String[] args) {
110         //抽象工厂  引用指向 实现类工厂
111         AbstractPlant abs1 = new XiaomiPlant();     //小米工厂
112         AbstractPlant abs2 = new HuaweiPlant();     //华为工厂
113 
114         System.out.println("=========xioami=======");
115         abs1.getGame().music();         //小米游戏机听音乐
116         abs1.getGame().playGame();      //小米游戏机打游戏
117         abs1.getPhone().callUp();       //小米手机打电话
118         abs1.getPhone().note();         //小米手机发短信
119 
120         System.out.println("=========huawei=======");
121         abs2.getGame().music();         //华为游戏机听音乐
122         abs2.getGame().playGame();      //华为游戏机打游戏
123         abs2.getPhone().callUp();       //华为手机打电话
124         abs2.getPhone().note();         //华为手机发短信
125     }
126 }

 

发表评论

0/200
178 点赞
0 评论
收藏
为你推荐 换一批