《设计模式之工厂模式》

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值