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 }