Spring中的设计模式(一):工厂模式

转自:https://blog.csdn.net/sinat_35500063/article/details/81913765

一、工厂模式

场景:以牛奶为例,有蒙牛、伊利、爱慕希等品牌。


 
 
  1. public interface Milk {
  2. /**
  3. * 获得一种牛奶产品
  4. * @return
  5. */
  6. String getName();
  7. }

产品实现接口:


 
 
  1. public class Menniu implements Milk{
  2. @Override
  3. public String getName() {
  4. return "蒙牛";
  5. }
  6. }

 
 
  1. public class Aimuxi implements Milk{
  2. @Override
  3. public String getName() {
  4. return "爱慕希";
  5. }
  6. }

 
 
  1. public class Yili implements Milk{
  2. @Override
  3. public String getName() {
  4. return "伊利";
  5. }
  6. }

1、简单工厂

又叫做静态工厂方法(StaticFactory Method)模式,它的实质是有一个工厂类根据传入的参数,动态的决定应该创建哪一个产品类。


 
 
  1. /**
  2. * 简单工厂(小作坊式)
  3. * Created by zwz on 2018/8/20.
  4. */
  5. public class SimpleFactory {
  6. public Milk getMilk(String name){
  7. if( "爱慕希".equals(name)){
  8. return new Aimuxi();
  9. } else if( "蒙牛".equals(name)){
  10. return new Menniu();
  11. } else if( "伊利".equals(name)){
  12. return new Yili();
  13. } else{
  14. System.out.println( "不能生产你所需的产品");
  15. return null;
  16. }
  17. }
  18. }

测试类:


 
 
  1. public class Test {
  2. public static void main(String[] args) {
  3. SimpleFactory factory = new SimpleFactory();
  4. Milk milk = factory.getMilk( "爱慕希");
  5. System.out.println(milk);
  6. }
  7. }

特点:

从一个方法中获取多中对象。

缺点:

拓展性差,需要创建新的对象时,需要去修改工厂类方法,还需维护标识。

 

2、工厂方法

工厂方法提供一个工厂接口,让其实现类决定实例化那种产品,并创建对应的类,

首先创个工厂模型:


 
 
  1. /**
  2. * 工厂模型
  3. * Created by zwz on 2018/8/20.
  4. */
  5. public interface Factory {
  6. Milk getMilk();
  7. }

多个工厂实现接口,每个工厂生产不同的产品:


 
 
  1. public class AimuxiFactory implements Factory{
  2. @Override
  3. public Milk getMilk() {
  4. return new Aimuxi();
  5. }
  6. }

 
 
  1. public class MenniuFactory implements Factory{
  2. @Override
  3. public Milk getMilk() {
  4. return new Menniu();
  5. }
  6. }

 
 
  1. public class YiliFactory implements Factory {
  2. @Override
  3. public Milk getMilk() {
  4. return new Yili();
  5. }
  6. }

测试类:


 
 
  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. Factory factory = new MenniuFactory();
  4. System.out.println(factory.getMilk());
  5. }
  6. }

优点

  • 一定程度上解耦,消费者不需关心产品实现类如何改变。
  • 一定程度上增加拓展性,若想要拓展产品,只需增加产品实现。
  • 一定程度上增加了代码的封装性,可读性。

缺点

  • 新增一个产品就需增加一个实现类,会造成代码泛滥。
  • 工厂的创建对用户而言较麻烦。

3、抽象工厂

抽象工厂,是spring中用的最为广泛的一种设计模式

首先创建一个抽象工厂类:


 
 
  1. /**
  2. * 抽象工厂
  3. * spring中用的最为广泛的一种设计模式
  4. * 为什么不使用接口:抽象类可以存储一些公共的逻辑,方便统一管理,易于拓展
  5. * Created by zwz on 2018/8/20.
  6. */
  7. public abstract class AbstractFactory {
  8. //这些是公共的逻辑,便于管理
  9. abstract Milk getMenniu();
  10. abstract Milk getYili();
  11. abstract Milk getAimuxi();
  12. }

实现类:


 
 
  1. public class MilkFactory extends AbstractFactory{
  2. @Override
  3. Milk getMenniu() {
  4. return new MenniuFactory().getMilk();
  5. }
  6. @Override
  7. Milk getYili() {
  8. return new YiliFactory().getMilk();
  9. }
  10. @Override
  11. Milk getAimuxi() {
  12. return new AimuxiFactory().getMilk();
  13. }
  14. }

测试类:


 
 
  1. public class AbstractFactoryTest {
  2. public static void main(String[] args) {
  3. MilkFactory factory = new MilkFactory();
  4. //对用户而言,获取产品更加简单
  5. System.out.println(factory.getYili());
  6. }
  7. }

优点

  • 代码结构简单。
  • 获取产品的过程更加简单。
  • 满足了开闭原则,即对拓展开放,对修改关闭。

缺点

  • 拓展较繁琐,要拓展时,需同时改动抽象工厂和工厂实现类。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值