设计模式----------工厂(Factory)模式

设计模式----------工厂(Factory)模式

  作用

    实现了创建者和调用者分离。

  工厂模式核心/本质:

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

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

 工厂模式详细分类

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

    实现以汽车为例

 1 //汽车接口
 2 public interface Car {
 3     void carName();
 4 }
 5 
 6 //三个实现类
 7 public class Audi implements Car {
 8     @Override
 9     public void carName() {
10         System.out.println("I`m Audi Car");
11     }
12 }
13 
14 public class Benz implements Car {
15     @Override
16     public void carName() {
17         System.out.println("I`m Benz Car");
18     }
19 }
20 
21 public class BMW implements Car {
22     @Override
23     public void carName() {
24         System.out.println("I`m BMW Car");
25     }
26 }
27 
28 //测试方法
29 public static void main(String[] args) {
30         Car c1 = new Audi();
31         Car c2 = new Benz();
32         Car c3 = new BMW();
33         c1.carName();
34         c2.carName();
35         c3.carName();
36     }

   此时如果需要增加一个类,那么开发人员又需要new一个对象。

  解决方案------简单工厂模式  /  静态工厂模式

 1 package com.qing.factory;
 2 
 3 public class FactoryMethod {
 4     /*
 5         解决方案一
 6             此时外部调用只需要传一个名字就可new一个该对象。但是此解决方案需改动方法内部代码结构
 7             违反了开闭原则
 8      */
 9     public static Car getCar(String carName){
10         if(carName == "Audi") {
11             return new Audi();
12         } else if(carName == "Benz") {
13             return new Benz();
14         }else if(carName == "BMW") {
15             return new BMW();
16         }else{
17             return null;
18         }
19     }
20     /*
21         解决方案二
         直接添加get方法获取对象
22 这种解决方案虽然也违反了开闭原则,但不涉及方法内部代码结构的改动, 23 在小型解决方案推荐使用此方案 24 */ 25 public static Car getAudi(){ 26 return new Audi(); 27 } 28 public static Car getBenz(){ 29 return new Benz(); 30 } 31 public static Car getBMW(){ 32 return new BMW(); 33 } 34 public static void main(String[] args) { 35 Car audi = FactoryMethod.getAudi(); 36 } 37 }

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

    

 1 //车接口
 2 public interface Car {
 3     void carName();
 4 }
 5 //车工厂接口
 6 public interface CarFactory {
 7     Car getCar();
 8 }
 9 //奥迪车实现类
10 public class Audi implements Car {
11     @Override
12     public void carName() {
13         System.out.println("I`m Audi Car");
14     }
15 }
16 //奥迪车工厂实现类
17 public class AudiFactory implements CarFactory{
18     @Override
19     public Car getCar() {
20         return new Audi();
21     }
22 }
23 //奔驰车实现类
24 public class Benz implements Car {
25     @Override
26     public void carName() {
27         System.out.println("I`m Benz Car");
28     }
29 }
30 //奔驰车工厂实现类
31 public class BenzFactory implements CarFactory {
32     @Override
33     public Car getCar() {
34         return new Benz();
35     }
36 }
37 //宝马车实现类
38 public class BMW implements Car {
39     @Override
40     public void carName() {
41         System.out.println("I`m BMW Car");
42     }
43 }
44 //宝马车工厂实现类
45 public class BMWFactory implements CarFactory {
46     @Override
47     public Car getCar() {
48         return new BMW();
49     }
50 }
51 
52 //测试方法
53 public class MyTest {
54     public static void main(String[] args) {
55         Car c1=new AudiFactory().getCar();
56         Car c2=new BenzFactory().getCar();
57         Car c3=new BMWFactory().getCar();
58         c1.carName();
59         c2.carName();
60         c3.carName();
61     }
62 }

 

    工厂方法模式虽然遵守设计原则,但是从结构复杂度、代码复杂度、编程复杂度、管理复杂度来说,简单工厂模式更容易实现。如下图,实现相同的功能,多了几个类

    

 

  3.抽象工厂模式(围绕一个超级工厂创建其他工厂,又称为其他工厂的工厂)

      直接上代码,整理手机、电脑、魅族、小米之间的瓜关系

 1 //手机产品接口
 2 public interface Phone {
 3     void start();
 4     void shutdown();
 5 }
 6 //魅族手机
 7 public class MezuPhone implements Phone {
 8     @Override
 9     public void start() {
10         System.out.println("魅族手机开机");
11     }
12 
13     @Override
14     public void shutdown() {
15         System.out.println("魅族手机关机");
16     }
17 }
18 //小米手机
19 public class MiPhone implements Phone {
20     @Override
21     public void start() {
22         System.out.println("小米手机开机");
23     }
24 
25     @Override
26     public void shutdown() {
27         System.out.println("小米手机关机");
28     }
29 }
30 //电脑产品接口
31 public interface Computer {
32     void start();
33     void shutdown();
34 }
35 //魅族电脑
36 public class MezuComputer implements Computer{
37     @Override
38     public void start() {
39         System.out.println("魅族电脑开机");
40     }
41 
42     @Override
43     public void shutdown() {
44         System.out.println("魅族电脑关机");
45     }
46 }
47 //小米电脑
48 public class MiComputer implements Computer {
49     @Override
50     public void start() {
51         System.out.println("小米电脑开机");
52     }
53 
54     @Override
55     public void shutdown() {
56         System.out.println("小米电脑关机");
57     }
58 }
59 //产品工厂
60 public interface ProductFactory {
61     Phone getPhone();
62 
63     Computer getComputer();
64 }
65 //魅族工厂
66 public class MezuProduct implements ProductFactory {
67     @Override
68     public Phone getPhone() {
69         return new MezuPhone();
70     }
71 
72     @Override
73     public Computer getComputer() {
74         return new MezuComputer();
75     }
76 }
77 //小米工厂
78 public class MiProduct implements ProductFactory {
79     @Override
80     public Phone getPhone() {
81         return new MiPhone();
82     }
83 
84     @Override
85     public Computer getComputer()  {
86         return new MiComputer();
87     }
88 }

 

  

  

   上图可看出产品工厂(ProductFactory)可以创建魅族和小米的产品,就可以分别获取手机和电脑对象了(可以把小米和魅族看作产品族,手机和电脑看作是产品系列)。总之一句话,抽象工厂是工厂的工厂

   引用一句维基百科的说明:

   工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列。

 

1 bgftg
2 
3 
4 ger
5 ge
6 
7 gers
View Code

 

工厂模式依赖的原则

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

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

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

 

posted @ 2020-09-16 18:14  秦鲸卿  阅读(257)  评论(0编辑  收藏  举报