1、工厂模式特点
可以工厂获取我们所需要的类。我们不需要知道工厂的内部是如何实现的,我们只需要告诉工厂我们需要哪个类,工厂就会自动返回我想要的类。
简单来说:工厂帮我们隐藏了复杂的逻辑处理过程,我们只需要关心结果。
2、工厂模式分类
1:简单工厂:功能强大,但可扩展性不强
2:工厂方法:独立分工,但学习成本过高
2:抽象工厂:简单工厂和工厂方法的结合
3、简单工厂模式
例:假设有一个人想通过运营商要买一个4G、5.5寸屏幕的手机。运营商符合标准的只有三个牌子的手机:HUAWEI、OPPO、VIVO。这时这个人只要知道自己想买什么牌子的手机就可以拿到手机了,不需要知道如何生产手机的。
实现:
(1)工艺标准接口
1 public Interface Phone{ 2 fine static int memory=4; 3 fine static float size=5.5; 4 string getPhone(); 5 }
(2)HUAWEI类,需要工艺标准那样子的手机
1 public class HUAWEI implement Phone{ 2 public String getPhone(){ 3 return "HUAWEI"+memory+"G内存"+size+"寸屏幕"; 4 } 5 }
(3)OPPO类,也是需要工艺标准那样子的手机
1 public class OPPO implement Phone{ 2 public String getPhone(){ 3 return "OPPO"+memory+"G内存"+size+"寸屏幕"; 4 } 5 }
(4)VIVO类,也是需要工艺标准那样子的手机
1 public class VIVO implement Phone{ 2 public String getPhone(){ 3 return "VIVO"+memory+"G内存"+size+"寸屏幕"; 4 } 5 }
(5)工厂类,实例化各牌子的手机供用户选择
1 public class SimpleFactory{ 2 public Phone getPhone(String name){ 3 if("HUAWEI".equalsIgnoreCse(name)){ 4 return new HUAWEI(); 5 }else if("OPPO".equalsIgnoreCase(name)){ 6 return new OPPO(); 7 }else if("VIVO".equalsIgnoreCase(name)){ 8 return new VIVO(); 9 }else{ 10 System.out.println("没有这个牌子的手机!!") 11 return null; 12 } 13 }
(6)测试类,这里只要知道我需要手机牌子的名字,我就可以得到对应的实例化对象,我不需要知道它是如何创建的
1 public class SimpleFactoryTest { 2 public static void main(String[] args) { 3 // 实现统一管理、专业化管理 4 Phone phone = new SimpleFactory().getPhone("HUAWEI"); 5 System.out.println("我获得了新手机:"+phone.getPhone()); 6 } 7 }
4、工厂方法模式
定义一套公开的标准,然后不同的品牌的手机不同的工厂生产,HUAWEI生产HUAWEI的,OPPO生产OPPO的,有自己的个性化设置
(1)定义公开标准
public interface Phone{ public Phone getPhone(); }
(2)HUAWEI生产HUAWEI手机,可以定制个性化
1 public class HUAWEIFactory implement Phone{ 2 public String color="白色"; 3 public Phone getPhone{ 4 return new HUAWEI(); 5 } 6 }
(3)OPPO生产OPPO的手机
1 public class OPPOFactory implement Phone{ 2 public String color="黑色"; 3 public Phone getPhone(){ 4 return new OPPO(); 5 } 6 }
(4)VIVO生产VIVO的手机
1 public class VIVOFactory implement Phone{ 2 public String color="红色"; 3 public Phone getPhone(){ 4 return new VIVO(); 5 } 6 }
(5)测试方法
public class Test{ public static void main(){ Phone phone=new HUAWEIFactory(); System.out.println("我要白色的HUAWEI手机:"+phone.getPhone); phone=new OPPOFactory(); System.out.println("我要黑色的OPPO手机:"+phone.getPhone); phone=new VIVOFactory(); System.out.println("我要红色的VIVO手机:"+phone.getPhone); } }
5、抽象工厂模式
第三代理品牌,代理了三家手机制造公司,然后卖给运营商,赚取中间差价。
1 #代理工厂 2 public abstract class AbstractFactory { 3 abstract Phone getPhone(); 4 //这段代码动态配置的功能 5 public Phone getPhone(String name) { 6 if ("HUAWEI".equalsIgnoreCase(name)) { 7 return new HUAWEIFactory().getPhone(); 8 } else if ("OPPO".equalsIgnoreCase(name)) { 9 return new OPPOFactory().getPhone(); 10 } else if ("VIVO".equalsIgnoreCase(name)) { 11 return new VIVOFactory().getPhone(); 12 } else { 13 System.out.println("这个r手机暂无生产"); 14 return null; 15 } 16 17 } 18 } 19 #默认工厂包装了HUAWEI类 20 public class DefaultFactory extends AbstractFactory{ 21 private HUAWEIFactory factory=new HUAWEIFactory(); 22 Phone getPhone() { 23 24 return factory.getPhone(); 25 } 26 }
(2)、HUAWEI工厂
1 public class HUAWEIFactory extends AbstractFactory { 2 public Phone getPhone() { 3 return new HUAWEI(); 4 } 5 }
(3)、OPPO工厂
1 public class OPPOFactory extends AbstractFactory { 2 public Phone getPhone() { 3 return new OPPO(); 4 } 5 }
(4)、VIVO工厂
1 public class VIVOFactory extends AbstractFactory { 2 public Phone getPhone() { 3 return new VIVO(); 4 } 5 }