大话设计模式-工厂模式

工厂模式

Spring IOC就是使用了工厂模式,对象的创建交给一个工厂去创建。

概念:工厂模式(Factory Pattern)使用一个共同的接口指向新创建的对象。

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类

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

何时使用:不同条件创建不同实例时

如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品

关键点:创建过程在其子类执行

应用实例:当你需要一辆汽车,可以直接去工厂提货,而不用管这辆车是怎们做出来的,以及汽车里面的具体实现

优点
1.调用者创建对象,只要知道其名称就可以了
2.扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以
3.屏蔽产品的具体实现,调用者只关心产品的接口

缺点
每次增加一个产品时,都要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖

使用场景
1.日志记录器:用户可以选择日志记录到本地硬盘、系统事件、远程服务器等
2.数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时
3.创建一个对象需要消耗的资源过多,比如I/O与数据库的连接等

实现

package factory;

/*
水果
 */
public interface Fruit {

    void eat();
}

package factory;

/*
创建一个实现接口的实体类
 */
public class Apple implements Fruit{
    @Override
    public void eat() {
        System.out.println("吃苹果!");
    }
}

package factory;

/*
创建一个实现接口的实体类
 */
public class Banana implements Fruit {
    @Override
    public void eat() {
        System.out.println("吃香蕉!");
    }
}

package factory;

/*
创建工厂类,生成对象
 */
public class Factoty {

    public static Fruit getFruit(String fruitName) {
        Fruit fruit = null;
        if(fruitName.equals("apple")){
            fruit = new Apple();
        } else if(fruitName.equals("banana")){
            fruit = new Banana();
        }
        return fruit;
    }

}

package factory;

/*
测试类
 */
public class Test {

    public static void main(String[] args) {

        //如果更换需求
        Fruit fruit = Factoty.getFruit("apple"); //工厂类
        eatFruit(fruit);
        System.out.println("Over");

    }

    public static void eatFruit(Fruit fruit){
        if(fruit != null){
            fruit.eat();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33591873/article/details/107324185
今日推荐