《设计模式之工厂模式》

来源:互联网 发布:数据挖掘用什么软件 编辑:程序博客网 时间:2024/06/16 20:55

1. 工厂模式的定义

工厂模式的英文定义为:
Define an iterface for creating an object, but let subclass decide which class to instantiate. Factory Method let a class defer instantiantion to subclasses.
这意味着:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到子类。工厂类的类图如下:
这里写图片描述
工厂模式有四类角色:
1)抽象工厂角色:该角色是工厂模式的核心,于应用系统无关,任何在创建对象的工厂类必须要实现这个接口。
2)具体工厂角色:该角色实现了抽象工厂接口,该类包含与应用密切相关的逻辑,收到客户端的调用以创建产品对象。
3)抽象产品角色:该角色负责定义产品的共性,实现了对产品最抽象的定义。
4)具体产品角色:该角色实现了抽象产品接口,工厂方法所创建的每一个对象都是某个具体的产品角色的实例。

2. 工厂模式的优点及应用

优点:
1)良好的封装性,代码结构清晰。一个对象的创建是有约束条件的,如果一个调用者需要一个具体的产品对象,只需要知道这个产品的的类名或者约束字符串即可,不需要知道创建对象的过程如何,降低了模块之间的耦合性。
2)优秀的扩展性。再增加产品类的情况下,只需要适当的修改具体的工厂类或者宽展一个工厂类,就可以适应变化。
3)屏蔽产品类。产品类的实现如何变化,调用者都无需关心,只需要关心产品的接口,只要接口保持不变,系统上层的模块就不要发生变化,因为产品的实例化是由工厂类负责的,具体生产哪一种产品由不同的工厂类决定。
4)工厂类模式是典型的解耦框架。
应用:
1)是new一个对象的替代方法。
2)需要灵活可扩展框架。
3)异构项目。
4)驱动测试。

3. 工厂模式的实例

本实例通过模拟手机生产来展示工厂模式,类图设计如下:
这里写图片描述
下面为代码:
①工厂类:
PhoneProducer.java

    public interface PhoneProducer {        public Phone factory();    }

MiPhoneProducer.java

    public class MiPhoneProducer implements PhoneProducer {        public Phone factory(){            return new MiPhone();        }    }

MiNotePhoneProducer.java

    public class MiNotePhoneProducer implements PhoneProducer {        public Phone factory(){            return new MiNotePhone();        }    }

②产品类:
Phone.java

    public interface Phone {        public void installCPU();        public void installMemory();        public void installShell();    }

MiPhone.java

    public class MiPhone implements Phone {        public static String name = "小米5";        public void installCPU(){            System.out.println(this.name + "安装了 骁龙820 处理器...");        }        public void installMemory(){            System.out.println(this.name + "安装了 2GB LPDDR4...");        }        public void installShell(){            System.out.println(this.name + "安装了 金属外壳...");        }    }

MiNotePhone.java

    public class MiNotePhone implements Phone {        public static String name = "小米Note Pro";        public void installCPU(){            System.out.println(this.name + "安装了 骁龙810 处理器...");        }        public void installMemory(){            System.out.println(this.name + "安装了 4GB LPDDR4...");        }        public void installShell(){            System.out.println(this.name + "安装了 塑料外壳...");        }    }

测试类:
TestFactory.java

    public class TestFactory{        public static void main(String[] argv){            PhoneProducer phoneProducer = new MiPhoneProducer();            Phone miPhone = phoneProducer.factory();            miPhone.installCPU();            miPhone.installMemory();            miPhone.installShell();            PhoneProducer phoneProducer1 = new MiNotePhoneProducer();            Phone miNotePhone = phoneProducer1.factory();            miNotePhone.installCPU();            miNotePhone.installMemory();            miNotePhone.installShell();        }    }

4. 测试结果

这里写图片描述

0 0
原创粉丝点击