Java设计模式(二) -- 工厂模式

版权声明:欢迎转载,请说明出处~~~ https://blog.csdn.net/java_1996/article/details/86096386

本章主要介绍了设计模式中的工厂模式,并结合实例描述了工厂模式的具体实现和使用场景。包括:普通工厂模式工厂方法模式抽象工厂模式等。

更多Java设计模式系列文章,欢迎访问我的个人博客–>幻境云图

1. 工厂模式介绍

工厂模式可以分为普通工厂模、工厂方法模式和抽象工厂模式。

简单工厂模式: 建立一个工厂类,根据传入的参数对实现了同一接口的一些类进行实例的创建。

工厂方法模式: 是对普通工厂方法模式的改进,提供多个工厂方法,分别创建对象。

抽象工厂模式: 创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

工厂模式优点:

(1) 解耦:把对象的创建和使用的过程分开

(2)减少重复代码: 若创建对象的过程很复杂,有一定的代码量,且很多地方都要用到,那么就会有很多重复代码。

(3) 降低维护成本 :创建过程都由工厂统一管理,发生业务逻辑变化,只需要在工厂里修改即可。

适用场景

(1)需要创建的对象较少。

(2)客户端不关心对象的创建过程。

2. 简单工厂模式

public interface Fruit {
    void eat();
}

public class Apple implements Fruit {
    @Override
    public void eat() {
        System.out.println("Apple");
    }
}
public class Orange implements Fruit {
    @Override
    public void eat() {
        System.out.println("Orange");
    }
}
//水果工厂 根据不同参数创建不同的水果对象
public class FruitFactory {
 public static Fruit creatFruit(String fruit){
     if (fruit.equals("Apple")) {
         return new Apple();
     } else if (fruit.equals("Orange")) {
         return new Orange();
     } else {
         System.out.println("error unknow fruit ~");
         return null;
     }
 }
}


public class FactoryTest {
    @Test
    public void testFactory() {
        Fruit apple = FruitFactory.creatFruit("Apple");
        apple.eat();
    }
}

3. 工厂方法模式

public interface ThreadFactory {

    /**
     * Constructs a new {@code Thread}.  Implementations may also initialize
     * priority, name, daemon status, {@code ThreadGroup}, etc.
     *
     * @param r a runnable to be executed by new thread instance
     * @return constructed thread, or {@code null} if the request to
     *         create a thread is rejected
     */
    Thread newThread(Runnable r);
}

具体的线程工厂可以implements这个接口并实现newThread(Runnable r)方法,来生产具体线程工厂想要生产的线程。

//抽象水果工厂
public interface FruitFactory {
    Fruit creatFruit();
}
//苹果工厂
public class AppleFactory implements FruitFactory{

    @Override
    public Fruit creatFruit() {
        return new Apple();
    }
}
//橘子工厂
public class OrangeFactory implements FrutiFactory {

    @Override
    public Fruit creatFruit() {
        return new Orange();
    }
}
//测试
public class FactoryTest {
    @Test
    public void testFactory() {
        AppleFactory appleFactory = new AppleFactory();
        Fruit apple = appleFactory.creatFruit();
        apple.eat();
        OrangeFactory orangeFactory = new OrangeFactory();
        Fruit orange = orangeFactory.creatFruit();
        orange.eat();
    }
}

4. 抽象工厂模式

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

//两个接口 Fruit Juice
public interface Fruit {
    void eat();
}
public interface Juice {
    void drink();
}
//四个对象 苹果 橘子 苹果汁 橘子汁
public class Apple implements Fruit {
    @Override
    public void eat() {
        System.out.println("Apple");
    }
}

public class Orange implements Fruit {
    @Override
    public void eat() {
        System.out.println("Orange");
    }
}

public class AppleJuice implements Juice {
    @Override
    public void drink() {
        System.out.println("AppleJuice");
    }
}

public class OrangeJuice implements Juice {
    @Override
    public void drink() {
        System.out.println("OrangeJuice");
    }
}

//抽象工厂 生产水果和果汁
public interface AbstractFactory {
     Fruit creatFruit();

     Juice creatJuice();
}
//具体工厂 生产苹果相关产品
public class AppleFactory implements AbstractFactory {
    @Override
    public Fruit creatFruit() {
        return new Apple();
    }

    @Override
    public Juice creatJuice() {
        return new AppleJuice();
    }
}
//具体工厂 生产橘子相关产品
public class OrangeFactory implements AbstractFactory {
    @Override
    public Fruit creatFruit() {
        return new Orange();
    }

    @Override
    public Juice creatJuice() {
        return new OrangeJuice();
    }
}

//测试
    @Test
    public void testFactory(){
        AppleFactory appleFactory=new AppleFactory();
        Fruit apple =  appleFactory.creatFruit();
        Juice appleJuice=  appleFactory.creatJuice();
        apple.eat();
        appleJuice.drink();
        OrangeFactory orangeFactory=new OrangeFactory();
        Fruit orange=  orangeFactory.creatFruit();
        Juice orangeJuice=  orangeFactory.creatJuice();
        orange.eat();
        orangeJuice.drink();
    }

5. 总结

工厂模式的优点?为什么要使用工厂模式

  • 工厂都是用来封装对象的具体创建过程,减少重复代码,降低对象变化时的维护成本,将对象创建过程和使用相解耦。
  • 工厂方法模式使用继承,抽象工厂使用对象组合;两者利用抽象的原则,将具体的实例化过程延迟到子类。
  • 工厂利用的最重要和基本的原则——依赖抽象,不要依赖具体类。

应用场景

简单工厂:适合创建同一级别的不同对象。

工厂方法:为每种产品提供一个工厂类,通过不同的工厂实例来创建不同的产品。

抽象工厂模式:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。

工厂模式在Java中的应用

简单工厂模式

JDK中的简单工厂模式有很多应用,比较典型的比如线程池。我们使用线程池的时候,可以使用ThreadPoolExecutor,根据自己的喜好传入corePoolSize、maximumPoolSize、keepAliveTimem、unit、workQueue、threadFactory、handler这几个参数,new出一个指定的ThreadPoolExecutor出来。

工厂方法模式

public interface ThreadFactory {

    /**
     * Constructs a new {@code Thread}.  Implementations may also initialize
     * priority, name, daemon status, {@code ThreadGroup}, etc.
     *
     * @param r a runnable to be executed by new thread instance
     * @return constructed thread, or {@code null} if the request to
     *         create a thread is rejected
     */
    Thread newThread(Runnable r);
}

这是一个生产线程的接口,具体的线程工厂可以implements这个接口并实现newThread(Runnable r)方法,来生产具体线程工厂想要生产的线程。

6. 参考

https://blog.csdn.net/d1562901685/article/details/77623237

https://www.cnblogs.com/xrq730/p/4905578.html

猜你喜欢

转载自blog.csdn.net/java_1996/article/details/86096386