设计模式——工厂方法模式

工厂方法模式

**定义:*定义一共用于创建对象的接口,让子类决定将哪个类实例化,工厂方法模式使一个类的实例化延迟到其子类。

工厂方法模式类图

角色:1.抽象产品(Product)2.抽象工厂(Factory)3.具体产品(ConcreteProduct)4.具体工厂(ConcreteProduct)
在这里插入图片描述
与简单工厂类似,不过将工厂类抽象化,这样做的好处是使得客户端只需要关心抽象产品和抽象工厂,完全不用理会返回的是哪一种具体产品,也无需关心是如何被具体工厂创建的,同时在新增一个产品时,只需要添加一共具体工厂和具体产品即可。这样满足开闭原则。缺点是可能会产生大量的类,增加系统的开销。
优点:
 (1)工厂方法模式减轻了工厂类的负担,把某一类/某一种东西指定一个工厂进行生产使得每个工厂职责清晰;
 (2)当要增加某一类”东西“并不需要修改工厂类,只需要增加这类”东西“的工厂即可,符合开放-封闭原则。
缺点:
(1)由于每增加一个产品就得相应的增加工厂,对于某些可以形成产品族的情形,不便于代码可扩展和可维护

实战题目

将原有的工厂进行分割,为每种品牌的电视机提供一个子工厂, 海尔工厂专门负责生产海尔电视机, 海信工厂专门负责生产海信电视机, 如果需要生产TCL电视机或创维电视机,只需要对应增加一个新的TCL工厂或创维工厂即可,原有的工厂无须做任何修改,使得整个系统具有更加的灵活性和可扩展性。绘制类图并给出完整代码及运行结果。

分析题目,说明采用的设计模式是什么?

可以看出原来的工厂变为了一个创建对象的接口,而TCL电视厂、海尔工厂作为子类决定了具体的生产产品,所以该设计模式为工厂方法模式。

绘制类图,说明其中的角色及作用

Client依赖与电视工厂与电视产品两个抽象类,两个抽象类分别由两个具体类来实现
在这里插入图片描述

public interface TVFactory

{    public TV produceTV();}

public class HaierTVFactory  implements TVFactory

{    public TV produceTV()

    {         System.out.println("海尔电视机工厂生产海尔电视机。");

          return new HaierTV();

    }

}

public class HisenseTVFactory implements TVFactory

{    public TV produceTV()

    {         System.out.println("海信电视机工厂生产海信电视机。");

                   return new HisenseTV();

    }

}

public interface TV

{     public void play();}

public class HaierTV implements TV

{     public void play()

       {

              System.out.println("海尔电视机播放中......");

       }

}

public class HisenseTV implements TV

{     public void play()

       {

              System.out.println("海信电视机播放中......");

       }    

}

public class Client

{     public static void main(String args[])

       {  

              TV tv;

         TVFactory factory;

         factory=new HaierTVFactory();

         tv=factory.produceTV();

         tv.play();

       }

}

总结

工厂方法模式主要新增了抽象工厂,和简单工厂不同的是,将创建对象的职责交给客户端(new 对应的工厂类),而简单工厂则是传一个参数,工厂类根据参数返回产品

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值