Java设计模式—工厂方法

什么是工厂

我们的日常理解,例如电子制造厂,工厂的作用就是制造我们需要的产品,例如手机,平板,电脑等。再用面向对象来理解,手机,平板,电脑就是对象,也就是说,工厂是用来生产对象的,我们需要什么就跟工厂拿。假如没有工厂的情况下,我们要什么就得自己做,因此工厂为我们提供了便利。

工厂方法联系生活

假如你开了一家公司,你一个合作的客户需要一大批的手机,假如你公司没有下属工厂,那你得自己做。假如你有工厂,你可以把生产的工作交给工厂,而你专注于其它方面的工作,例如跟其它客户交谈。

此时的模式从:
客户(提出需求) —> 公司,公司 (制造产品)—> 客户
转变为:
客户(提出需求) —> 公司,公司 (分配任务)—> 工厂,工厂(制造产品)—> 公司,公司 (提供产品)—> 客户

这样的好处是,降低了公司和客户的耦合,使得公司可以着手做其他工作!

代码分析

interface Electronic{//电子产品
    void type();
}

interface ElectronicFactory{//电子产品工厂
    Electronic getElectronic();//制造产品
}

class IPhone implements Electronic{
    @Override
    public void type() {
        System.out.println("I am a iPhone");
    }
}

class IPad implements Electronic{
    @Override
    public void type() {
        System.out.println("I am a iPad");
    }
}

class IPhoneFactory implements ElectronicFactory{
    @Override
    public Electronic getElectronic() {
        return new IPhone();//制造一个iPhone
    }
}

class IPadFactory implements ElectronicFactory{
    @Override
    public Electronic getElectronic() {
        return new IPad();//制造一个iPad
    }
}

public class Company {
    static void getProducts(ElectronicFactory factory){
        Electronic electronic = (IPhone) factory.getElectronic();
        electronic.type();
    }
    public static void main(String[] args){
        getProducts(new IPhoneFactory());//需要iPhone
        //getProducts(new IPadFactory ());//需要iPad
    }

}

工厂方法大概就是这么回事,但是我们还可以优化上面这个工厂模式。

更优雅的工厂方法实现

使用匿名内部类来实现工厂

interface Electronic{//电子产品
    void type();
}

interface ElectronicFactory{//电子产品工厂
    Electronic getElectronic();//制造产品
}

class IPhone implements Electronic{
    @Override
    public void type() {
        System.out.println("I am a iPhone");
    }

    public static ElectronicFactory factory = new ElectronicFactory() {

        @Override
        public Electronic getElectronic() {
            return new IPhone();
        }
    };

}

class IPad implements Electronic{

    @Override
    public void type() {
        System.out.println("I am a iPad");
    }

    public static ElectronicFactory factory = new ElectronicFactory() {

        @Override
        public Electronic getElectronic() {
            return new IPad();
        }
    };

}

public class Company {
    static void getProducts(ElectronicFactory factory){
        Electronic electronic = (IPhone) factory.getElectronic();
        electronic.type();
    }
    public static void main(String[] args){
        getProducts(IPhone.factory);//需要iPhone
        getProducts(IPad.factory);//需要iPad
    }

}

最后有一点也要切记,不要为了使用设计模式而使用设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值