Java设计模式学习之工厂模式


简单工厂模式

我直接上代码代码里有很详细的注解

//简单工厂模式 是由一个工厂对象决定创建出哪种产品

class Factory1
{
         publicstatic void main(String[] args)
         {
                   //通过工厂方法生产白面包
                   BreadMakerwhite=BreadFactory.createBreadMaker(0);
                   white.GetMaker();
                   //通过工厂方法生产黑面包
                   BreadMakerblack=BreadFactory.createBreadMaker(1);
                   black.GetMaker();
                   //通过工厂方法生产绿面包
                   BreadMakergreen=BreadFactory.createBreadMaker(2);
                   green.GetMaker();
         }       
}
//面包类抽象类
abstract class BreadMaker
         {
                   //得到面包抽象方法
                   abstractpublic void GetMaker();
                  
         }
         //白面包类 继承抽象类  覆写抽象方法
         classWhiteBread extends BreadMaker
         {
                   publicvoid GetMaker()
                   {
                            System.out.println("做出了白面包");
                   }
         }
//黑面包类
         classBlackBread extends BreadMaker
         {
                   publicvoid GetMaker()
                   {
                            System.out.println("做出了黑面包");
                   }
         }
         //绿面包类
         classGreenBread extends BreadMaker
         {
                   publicvoid GetMaker()
                   {
                            System.out.println("做出了绿面包");
                   }
         }
         //面包生产方法  通过静态方法BreadMakercreateBreadMaker(int breadType)决定生产哪种面包
         classBreadFactory
         {
                   publicstatic BreadMaker createBreadMaker(int breadType)
                   {
                            BreadMakerbreadMaker=null;
                            switch(breadType)
                            {
                                     case0:
                                                breadMaker=new WhiteBread();
                                     break;
                                     case1:
                                                breadMaker=new BlackBread();
                                     break;
                                     case2:
                                                breadMaker=new GreenBread();
                                     break;
                                     default:
                                               break;
                            }
                            returnbreadMaker;
                   }
         }
 
 
//有一个问题  当需要增加面包类型时  就需要修改BreadFactory类 增加case分支 这样违反了开闭原则。
//下面就有了工厂方法模式 定义一个用于创建的接口 让子类决定实例化哪个类 工厂方法//使得一个类的实例化延迟到其子类


工厂方法模式

//工厂方法模式 定义一个用于创建的接口
//让子类决定实例化哪个类 工厂方法使得一个类的实例化延迟到其子类
class Factory2
{
         publicstatic void main(String[] args)
         {
                   IFactorywhiteBreadMakerFactory=new WhiteBreadMakerFactory();
                   BreadMakerwhite=whiteBreadMakerFactory.createBreadMaker();
                   white.GetMaker();
 
                   IFactoryblackBreadMakerFactory=new BlackBreadMakerFactory();
                   BreadMakerblack=blackBreadMakerFactory.createBreadMaker();
                   black.GetMaker();
 
                   IFactorygreenBreadMakerFactory=new GreenBreadMakerFactory();
                   BreadMakergreen=greenBreadMakerFactory.createBreadMaker();
                   green.GetMaker();
                  
                   IFactoryblueBreadMakerFactory=new BlueBreadMakerFactory();
                   BreadMakerblue=blueBreadMakerFactory.createBreadMaker();
                   blue.GetMaker();
         }
}
 
//面包类抽象类
abstract class BreadMaker
         {
                   //得到面包抽象方法
                   abstractpublic void GetMaker();
                  
         }
         //白面包类 继承抽象类  覆写抽象方法
         classWhiteBread extends BreadMaker
         {
                   publicvoid GetMaker()
                   {
                            System.out.println("做出了白面包");
                   }
         }
//黑面包类
         classBlackBread extends BreadMaker
         {
                   publicvoid GetMaker()
                   {
                            System.out.println("做出了黑面包");
                   }
         }
         //绿面包类
         classGreenBread extends BreadMaker
         {
                   publicvoid GetMaker()
                   {
                            System.out.println("做出了绿面包");
                   }
         }
 
         //蓝面包类  新增加
         classBlueBread extends BreadMaker
         {
                   publicvoid GetMaker()
                   {
                            System.out.println("做出了蓝面包");
                   }
         }
 
//工厂方法接口
interface IFactory
{
         publicBreadMaker createBreadMaker();
}
//白面包工厂类
class WhiteBreadMakerFactory implementsIFactory
{
         public  BreadMaker createBreadMaker()
         {
                   BreadMakerbreadMaker=new WhiteBread();
                   returnbreadMaker;
         }
}
//黑面包工厂类
class BlackBreadMakerFactory implementsIFactory
{
         public  BreadMaker createBreadMaker()
         {
                   BreadMakerbreadMaker=new BlackBread();
                   returnbreadMaker;
         }
}
//绿面包工厂类
class GreenBreadMakerFactory implementsIFactory
{
         public  BreadMaker createBreadMaker()
         {
                   BreadMakerbreadMaker=new GreenBread();
                   returnbreadMaker;
         }
}
//蓝面包工厂类
class BlueBreadMakerFactory implementsIFactory
{
         public  BreadMaker createBreadMaker()
         {
                   BreadMakerbreadMaker=new BlueBread();
                   returnbreadMaker;
         }
}
 
 
//通过上面的例子 看以看出  当增加新产品时  在工厂方法模式时  只要相应的增加新增产品的类
// 和工厂类  这样就能很好的符合开闭原则  当然  每增加一个产品 需要增加相应对方类和工厂类 也增加了额外的工作量
// 但是有一个问题 当我们需要增加一个类型的产品 比如披萨  但是我们可以重新利用之前已有的工厂,比如工厂
//的机器、设备等   那该如何呢。 如果按照工厂方法模式 那就需要增加披萨类 和披萨的工厂方法  而且这个工厂是新建的
//如要重新买设备 那该多浪费
// 基于此  提出了抽象工厂模式  比如 生产白面包的工厂还能生产白披萨 那么就节约设备资金啦, 也就是节约了代码量



抽象工厂模式

//抽象工厂模式
class Factory3
{
         publicstatic void main(String[] args)
         {
                   IFactorywhiteBreadMakerFactory=new WhiteBreadMakerFactory();
                   BreadMakerwhiteBread=whiteBreadMakerFactory.createBreadMaker();
                   whiteBread.GetMaker();
                   PizzawhitePizza=whiteBreadMakerFactory.createPizza();
                   whitePizza.GetMaker();
 
                   IFactoryblackBreadMakerFactory=new BlackBreadMakerFactory();
                   BreadMakerblackBread=blackBreadMakerFactory.createBreadMaker();
                   blackBread.GetMaker();
                   PizzablackPizza=blackBreadMakerFactory.createPizza();
                   blackPizza.GetMaker();
                  
                   IFactorygreenBreadMakerFactory=new GreenBreadMakerFactory();
                   BreadMakergreenBread=greenBreadMakerFactory.createBreadMaker();
                   greenBread.GetMaker();
                   PizzagreenPizza=greenBreadMakerFactory.createPizza();
                   greenPizza.GetMaker();
 
                   //另一种类实例化的方法 反射
                   try
                   {
                            Class<?>c=Class.forName("WhiteBreadMakerFactory");
                   try
                            {                          
                            whiteBreadMakerFactory=(IFactory)c.newInstance();
                            whitePizza=whiteBreadMakerFactory.createPizza();
                            whitePizza.GetMaker();
                            }
                            catch(Exception ee)
                            {
                            }
                   }
                   catch(ClassNotFoundException e)
                   {
                   }
                  
         }
}
 
//面包类抽象类
abstract class BreadMaker
         {
                   //得到面包抽象方法
                   abstractpublic void GetMaker();
                  
         }
         //白面包类 继承抽象类  覆写抽象方法
         classWhiteBread extends BreadMaker
         {
                   publicvoid GetMaker()
                   {
                            System.out.println("做出了白面包");
                   }
         }
//黑面包类
         classBlackBread extends BreadMaker
         {
                   publicvoid GetMaker()
                   {
                            System.out.println("做出了黑面包");
                   }
         }
         //绿面包类
         classGreenBread extends BreadMaker
         {
                   publicvoid GetMaker()
                   {
                            System.out.println("做出了绿面包");
                   }
         }
 
  //新增的披萨类
 abstract class Pizza{
         abstractvoid GetMaker();
  }
 
         //白披萨
         classWhitePizza extends Pizza
         {
                   publicvoid GetMaker(){
                            System.out.println("做出了白披萨");
                   }
         }
 
         //黑披萨
         classBlackPizza extends Pizza
         {
                   publicvoid GetMaker(){
                            System.out.println("做出了黑披萨");
                   }
         }
 
         //绿披萨
         classGreenPizza extends Pizza
         {
                   publicvoid GetMaker(){
                            System.out.println("做出了绿披萨");
                   }
         }
 
//工厂方法接口
interface IFactory
{
         publicBreadMaker createBreadMaker();
 
         publicPizza createPizza();  //新增 生产披萨方法
}
//白面包工厂类
class WhiteBreadMakerFactory implementsIFactory
{
         public  BreadMaker createBreadMaker()
         {
                   BreadMakerbreadMaker=new WhiteBread();
                   returnbreadMaker;
         }
 
         publicPizza createPizza(){
                   returnnew WhitePizza();
         }
}
//黑面包工厂类
class BlackBreadMakerFactory implementsIFactory
{
         public  BreadMaker createBreadMaker()
         {
                   BreadMakerbreadMaker=new BlackBread();
                   returnbreadMaker;
         }
 
         publicPizza createPizza(){
                   returnnew BlackPizza();
         }
}
//绿面包工厂类
class GreenBreadMakerFactory implementsIFactory
{
         public  BreadMaker createBreadMaker()
         {
                   BreadMakerbreadMaker=new GreenBread();
                   returnbreadMaker;
         }
 
         publicPizza createPizza(){
                   returnnew GreenPizza();
         }
}
 
//从以上代码可以看出 当我们新增一类产品时 而且该类产品能够重用工厂的资源 那么用抽象工厂方法 能够
//很好的解决这个问题
 
//工厂各方法比较
//1.简单工厂模式比较简单 分离了客户端和后台逻辑 使得客户端无需关心后台的实现 去除了客户端与具体产品
//的依赖  增强了移植性能 但是其违背了开闭原则,添加新产品时将会非常麻烦。
//2.工厂方法模式 易于添加新产品 后台模块符合开闭原则 但是新产品的添加会大量的新增类,增加了工作量
//3.抽象工厂模式 分离了具体的类 客户端直接操作抽象接口。
 
//对于工厂模式, 需要灵活应用 在不同的场合运用不同的模式 这样将会使我们的代码更加健壮、并且更易维护和拓展.


学习自 刘径舟老师 张玉华老师编著的《设计模式其实很简单》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值