设计模式之工厂模式

工厂模式

1:简单工厂模式

public interface Milk {
    //获取一个标准产品
    public String getName();
}
public class SanLu implements Milk {
    @Override
    public String getName() {
        return "三路";
    }
}
public class TeLunSu implements Milk {
    @Override
    public String getName() {
        return "特仑苏";
    }
}
public class YiLi implements Milk {
    @Override
    public String getName() {
        return "伊利";
    }
}
/*从简单工厂角度
增加新的品种要加新的业务逻辑,而且不利于修改
 * */
public class simpleFactory {
    public Milk getMilk(String name){
       if("特仑苏".equals(name)){
           return new TeLunSu();
       }else if ("伊利".equals(name)){
           return new YiLi();
       }
       return null;
    }
}
public class Test {
    public static void main(String[] args) {
        //从用户角度修改新的品种需要知道牛奶的品种(实际上不知道工厂到底提供什么)
        //用户不再关心生产的过程,只关心自己想要的结果
        //这是小作坊标准
        //用户需要指明自己要的什么牛奶,假如写了个特特呢,就会破坏程序健壮性
        //用户只能选择工厂所拥有的牛奶类型,并且可以随意写任何类型,简单工厂在这里就控制不了。
        System.out.println(new simpleFactory().getMilk("特仑苏"));
    }
}
#1.1特点

扩展性差,想要添加新的牛奶品牌客户端和工厂都要改造。

2:工厂方法模式

#2.1模式描述

提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。

#2.2相比于简单工厂模式的优势
  • 从一定角度上进行了解耦,用户只需要有哪些工厂类。
  • 可以从一定角度解耦,若要增加一个产品实现,只需要实现工厂接口。
  • 可以从一定角度上增加代码的封装性以及可读性。
#2.3模式要素
  • 提供一个产品类的接口。产品类均要实现这个接口(Milk接口,也可以是abstract类,即抽象产品)。
  • 提供一个工厂类的接口。工厂类均要实现这个接口(Factory接口,即抽象工厂)。
  • 由工厂实现类创建产品类的实例。工厂实现类应有一个方法,用来实例化产品类。
    这里写图片描述
//工厂方法要加新的品种,直接加新的相关的工厂,比如SanLuFactory,实现这个接口就好了
public interface Factory {
    //工厂必然有生产产品的技能,统一的产品出口
    Milk getMilk();
}
public class TeLunSuFactory implements Factory {
    //事情做了越来越专业
    @Override
    public Milk getMilk() {
        return new TeLunSu();
    }
}
public class YiLiSuFactory implements Factory {

    //事情做了越来越专业
    @Override
    public Milk getMilk() {
        return new YiLi();
    }
}
public class FactoryTest {
    public static void main(String[] args) {
        //从工厂角度看
        //我们在小作坊期间是生产特仑苏伊利等等牛奶,等技术成熟之后,形成了特仑苏标准,伊利标准,分工更细
        //特仑苏就由特仑苏工厂去生产,伊利就由伊利工厂去生产。

        //从用户角度去看 用户还得自己去选择哪个特仑苏工厂(其实跟简单工厂有点类似,还是得自己知道是什么工厂)
        Factory factory=new TeLunSuFactory();
        System.out.println(factory.getMilk());
    }
}

3:抽象工厂

public abstract   class AbstractFac {
    //从工厂角度,要新加三鹿这个品种,只需要再这里告诉牛奶厂还需要加三鹿
    //牛奶厂就会再去添加三鹿厂商生产新的品种牛奶。
    /*
    * 抽象工厂是用户的主入口
    * */
    public  abstract  Milk getTeLunSu();

    public abstract Milk getYiLi();
}
public class MilkFactory extends AbstractFac {

    @Override
    public Milk getTeLunSu() {
        return new TeLunSuFactory().getMilk();
    }

    @Override
    public Milk getYiLi() {
        return new YiLiSuFactory().getMilk();
    }
}
public class AbstractFactoryTest {
    public static void main(String[] args) {
        /*
        * 增加新的品种,用户只需要更新API,他就知道工厂能生产哪些产品,
        * 不需要关心怎么生产,比如工厂方法就需要知道是使用的哪个工厂去生产的
        * */
        //对于用户而言更加简单,用户只有选择的权利,保证了程序的健壮性。
        MilkFactory milkFactory=new MilkFactory();
        System.out.println(milkFactory.getTeLunSu());
    }
}

4:抽象工厂模式与工厂方法模式的区别

抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构(比如特仑苏工厂全部生产特仑苏,三鹿工厂全部生产三鹿);而抽象工厂模式则是针对的多个产品等级结构(比如牛奶工厂生产特仑苏,三鹿,伊利等牛奶,衍生的对象是同一个产品)。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类(new TeLunsuFactory(),new SanLuFactory(),new YiLiFactory()等等,衍生的对象是不同工厂)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mindcarver

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值