大话Java设计模式之工厂模式

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/yjy91913/article/details/79567965

具有代表性的设计模式:

这里写图片描述

我们在使用设计模式时:切记先有业务场景,才有设计模式

设计模式有六大原则:

单一职责原则
里氏替换原则
依赖倒置原则
接口隔离原则
迪米特法则
开闭原则

设计模式的关系

这里写图片描述

注意:源码中的 设计模式通常不是单一使用的

设计模式在我的理解是前人栽树 后人乘凉
总结前人经验 提供设计模式给后人使用
设计模式提高代码可读性,可扩展性

工厂模式有三种形态:

简单工厂

简单工厂又叫做静态工厂,但不属于23中设计模式
他的实质是由一个工厂类传入的参数,动态的决定该创建哪一种产品

Spring的beanFactory就是简单工厂模式的体现
下面是一个例子:

public class SampleFactory {
    public Milk getMilk(String name){
        switch (name) {
            case "特仑苏":return new TeLunSu();
            case "蒙牛":return new MengNiu();
            case "伊利":return new Yili();
            default:return null;
        }
    }
}

工厂方法模式

一般情况,应用程序有自己的工厂对象来创建Bean,同时将工厂交给Spring管理

下面是一个例子:

牛奶厂接口

public interface Factory {
    Milk getMilk();
}

蒙牛厂类

public class MengLiuFactory implements Factory {
    @Override
    public Milk getMilk() {
        return new MengNiu();
    }
}

特仑苏厂类

public class TeLunSuFactory implements Factory {
    @Override
    public Milk getMilk() {
        return new TeLunSu();
    }
}

伊利厂类

public class YiLiFactory implements Factory {
    @Override
    public Milk getMilk() {
        return new Yili();
    }
}
public class FactoryTest {
    public static void main(String[] args) {
        Factory factory = new MengLiuFactory();
        Milk milk = factory.getMilk();
    }
}

这样,用户使用的时候 ,只需要拿到某种工厂类,就使用了,不用考虑使用成产过程,只拿结果就可以了

抽象工厂模式

工厂的抽象类

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
注意事项:产品族难扩展,产品等级易扩展。

/**
 * 描述:
 * 抽象工厂 用户的主入口
 * 在spring中用的最广泛
 */
public abstract class AbstractFactory {

    /**
     * @return
     * Spring中增加功能,但是他的用户无感知
     */
    public abstract Milk getMengNiu();
    public abstract Milk getYiLi();
    public abstract Milk getTeLunSu();

}

MilkFactory 的实现类

public class MilkFactory extends AbstractFactory {
    @Override
    public Milk getMengNiu() {
        return new MengLiuFactory().getMilk();
    }

    @Override
    public Milk getYiLi() {
        return new YiLiFactory().getMilk();
    }

    @Override
    public Milk getTeLunSu() {
        return new TeLunSuFactory().getMilk();
    }
}
/**
 * 描述:
 * 抽象工厂 用户的主入口
 *
 * @author Yangjy
 * @version 1.0.0
 * @create 2018-03-15 10:03
 */
public abstract class AbstractFactoryTest {

    public static void main(String[] args) {
        MilkFactory milkFactory = new MilkFactory();

        //用户有了选择的权利,保证了代码的健壮性
        Milk mengNiu = milkFactory.getMengNiu();
    }
}

这种模式就是Spring中用的非常的模式

猜你喜欢

转载自blog.csdn.net/yjy91913/article/details/79567965