每天学习一个设计模式-5.简单工厂模式

装饰模式的本质是:选择实现。

一、简单工厂模式的定义:

提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。

严格来说,简单工厂并不属于23类设计模式,但是它小巧,灵活,在代码中也被大量使用。

一、应用场景

1)想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选择用简单工厂,让客户端通过工厂来获取相应的接口,而无须关心具体的实现;
2)如果想要把对象的职责集中管理和控制,可以选择用简单工厂,一个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制。

三、代码示例

假设有一个水果工厂,生产各种水果,代码如下:

1、水果接口

public interface Fruit {
    void print();
}

2、各种水果

// 苹果
public class Apple implements Fruit {
    @Override
    public void print() {
        System.out.println("it's an apple");
    }
}

// 香蕉
public class Banana implements Fruit {
    @Override
    public void print() {
        System.out.println("it's a banana");
    }
}

// 橘子
public class Orangle implements Fruit {
    @Override
    public void print() {
        System.out.println("it's an orangle");
    }
}

// 梨子
public class Pear implements Fruit {
    @Override
    public void print() {
        System.out.println("it's a pear");
    }
}

3、水果工厂

public class FruitFactory {

    public static Fruit getFruitMethod1(Class clzz) {

        try {
            return clzz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }

        return null;
    }
}

4、客户端

public class Client {
    public static void main(String[] args) {

        Apple apple = (Apple) FruitFactory.getFruitMethod1(Apple.class);
        apple.print();

        Orangle orangle = (Orangle) FruitFactory.getFruitMethod1(Orangle.class);
        orangle.print();

        Banana banana = (Banana) FruitFactory.getFruitMethod1(Banana.class);
        banana.print();

        Pear pear = (Pear) FruitFactory.getFruitMethod1(Pear.class);
        pear.print();
    }
}

四、简单工厂的优缺点

优点

1)帮助封装;
2)解耦。

缺点

1)可能增加客户端的复杂度。
如果是采用客户端参数来选择具体的实现类,那么必须让客户端理解各个参数的具体含义,这会增加客户端选择的难度,也在一定程度上暴露了内部实现的一些细节。

你可能感兴趣的:(每天学习一个设计模式-5.简单工厂模式)