设计模式之建造型-简单工厂模式(2)

工厂模式是我们最常用的实例化对象的模式了,使用工厂模式可以给系统带来更大的拓展性和更小的修改量。


1,普通工厂模式。

普通工厂模式用例图

这里写图片描述

首先我们创建phone接口

public interface Phone {
     void  call();
}




phone有打电话的功能


其次,我们创建实现类

public class HuaWeiPhone implements Phone {

    @Override
    public void call() {
        Log.i("tag:","华为手机打电话");
    }
}





public class XiaomiPhone implements  Phone{
    @Override
    public void call() {
        Log.i("tag:","小米手机打电话");
    }
}





最后我们创建工厂类其次,我们创建实现类
public class PhoneFactory  {

       public  Phone creatPhone(String phoneName){
           if (phoneName.equals("华为")){
               return  new HuaWeiPhone();
           }else if (phoneName.equals("小米")){
               return new XiaomiPhone();
           }else {
               Log.i("tag:","工厂暂时没有这个手机型号");
               return null;
           }

       }
}





最后我们测试一下
public class Test  {
    public static void main(String[] args) {
        PhoneFactory phoneFactory=new PhoneFactory();
        Phone huawei = phoneFactory.creatPhone("华为");
        Phone xiaomi = phoneFactory.creatPhone("小米");
        huawei.call();
        xiaomi.call();

    }
}



输出:tag:华为手机打电话
tag:小米手机打电话
以上就是一个普通工厂模式

2.工厂方法模式


定义:定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象
工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况
下引进新的产品。 ---来自百度百度

可以看到工厂方法模式相比简单工厂,多定义了一个工厂接口,废话不说,直接上代码,仍然举上面的例子

这里我们定义了一个IFactory 工厂接口类
public interface IFactory {
     Phone  creatPhone();
}




然后创建相对应的实现类,实现工厂接口
public class HuaweiFactory implements IFactory {
    @Override
    public Phone creatPhone() {
        return new HuaWeiPhone();

    }
}



public class XiaoMiFactory implements IFactory {
    @Override
    public Phone creatPhone() {
        return new XiaoMiPhone();

    }
}
最后我们测试一下
public class Test {
    public static void main(String[] args) {
         IFactory huaweiFactory=new HuaweiFactory();
        Phone phone = huaweiFactory.creatPhone();
        phone.call();
        IFactory xiaomiFactory=new XiaoMiFactory();
        Phone phone1 = xiaomiFactory.creatPhone();
        phone1.call();

    }
}



输出:tag:华为手机打电话
tag:小米手机打电话
以上是工厂方法模式的简单应用,可以看出,客户端使用时,只需要去调用具体的工厂实现类即可,省去了if else的判断
工厂方法经常用在以下两种情况中:
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值