设计模式专题(一)工厂模式

目录

工厂模式

简单工厂模式

工厂方法模式

抽象工厂模式

工厂模式

为了便于理解,这里做一个小案例:

1、首先制造一个牛奶类:

public interface Milk {

    /**
     * 获取一个标准产品
     * @return
     */
    public String getName();

}

2、然后制造很多的具体牛奶类,实现这个接口:

蒙牛类:

public class Mengniu implements Milk {

    public String getName() {
        return "蒙牛";
    }
}

特仑苏类:

public class Telunsu implements Milk {

    public String getName() {
        return "特仑苏";
    }
}

伊利类:

public class Yili implements  Milk {

    public String getName() {
        return "伊利";
    }
}

简单工厂模式

含义:

  • 简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例。

适用场景:

  • 工厂类负责创建的对象较少。
  • 客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。

优点:

  • 只需传入一个正确的参数,就可以获取你所需要的对象无须知道其创建的细节。

缺点 :

  • 工厂类的职责相对过重,增加新的产品时需要修改工厂类的判断逻辑,违背开闭原则。
  • 不易于扩展过于复杂的产品结构。

1、创建一个简单工厂

public class SimpleFactory {
    public Milk getMilk(String name){
        if("特仑苏".equals(name)){
            return new Telunsu();
        }else if("伊利".equals(name)){
            return new Yili();
        }else if("蒙牛".equals(name)){
            return new Mengniu();
        }else {
            System.out.println("不能生产您所需的产品");
            return null;
        }
    }
}

2、测试简单工厂模式   

public static void main(String[] args) {
    
        //这个new的过程实际上一个比较复杂的过程
        //有人民币及不需要自己new了
        System.out.println(new Telunsu().getName());

        //小作坊式的生产模式
        //用户本身不再关心生产的过程,而只需要关心这个结果
        //假如:特仑苏、伊利、蒙牛
        //成分配比都是不一样的
        SimpleFactory factory = new SimpleFactory();

        //把用户的需求告诉工厂
        //创建产品的过程隐藏了,对于用户而且完全不清楚是怎么产生的
        System.out.println(factory.getMilk("特仑苏").getName());
    }

工厂方法模式

含义:

  • 工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。主要解决产品扩展的问题。

适用场景:

  • 创建对象需要大量重复的代码。
  • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。
  • 一个类通过其子类来指定创建哪个对象。

优点:

  • 用户只需关心所需产品对应的工厂,无须关心创建细节。
  • 加入新产品符合开闭原则,提高了系统的可扩展性。

缺点 :

  • 类的个数容易过多,增加了代码结构的复杂度。
  • 增加了系统的抽象性和理解难度。

1、创建工厂

public interface Factory {

    //工厂必然具有生产产品技能,统一的产品出口
    Milk getMilk();

}

2、创建工厂实现类

public class MengniuFactory implements  Factory {
    public Milk getMilk() {
        return new Mengniu();
    }
}
public class TelunsuFactory implements Factory {
    public Milk getMilk() {
        return new Telunsu();
    }
}
public class YiliFactory implements Factory {
    public Milk getMilk() {
        return new Yili();
    }
}

3、测试工厂方法模式

public static void main(String[] args) {
        //System.out.println(new Factory().getMilk(););
        //货比三家
        //不知道谁好谁好谁坏
        //配置,可能会配置错
        Factory factory = new SanluFactory();
        System.out.println(factory.getMilk());
    }

抽象工厂模式

含义:

  • 抽象工厂模式(Abastract Factory Pattern)是指提供一个创建一系列相关或相互依赖对象的接口,无须指定他们具体的类。
  • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节,强调的是一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。需要提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

适用场景:

  • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。
  • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。
  • 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

优点:

  • 具体产品在应用层代码隔离,无须关心创建细节
  • 将一个系列的产品族统一到一起创建。

缺点 :

  • 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。
  • 增加了系统的抽象性和理解难度。

1、创建抽象工厂

public abstract class AbstractFactory {

    //公共的逻辑
    //方便于统一管理

    /**
     * 获得一个蒙牛品牌的牛奶
     * @return
     */
    public  abstract Milk getMengniu();

    /**
     * 获得一个伊利品牌的牛奶
     * @return
     */
    public abstract  Milk getYili();

    /**
     * 获得一个特仑苏品牌的牛奶
     * @return
     */
    public  abstract  Milk getTelunsu();

}

2、创建抽象工厂实现类

public class MilkFactory extends  AbstractFactory {

    @Override
    public Milk getMengniu() {
        return new Mengniu();
    }
    
    @Override
    public Milk getYili() {
        return new Yili();
    }
    
    @Override
    public Milk getTelunsu() {
        return new Telunsu();
    }
}

3、测试抽象工厂模式

public static void main(String[] args) {

        MilkFactory factory = new MilkFactory();
        //对于用户而言,更加简单了
        //用户只有选择的权利了,保证了程序的健壮性
        System.out.println(factory.getMengniu());
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值