• 设计模式之工厂


    本章有工厂方法和抽象工厂设计模式

    工厂方法

    工厂方法 定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。

    工厂方法的目的是使得创建对象和使用对象是分离的

    工厂接口,工厂接口中带有静态方法返回真正的子类

    public interface NumberFactory {
        Number parse(String s);
    
        public static NumberFactory getFactory() {
            return numberCreate;
        }
    
        static NumberFactory numberCreate = new NumberCreateImpl();
    }
    
    public class NumberCreateImpl implements NumberFactory {
    
        @Override
        public Number parse(String s) {
            return new BigDecimal(s);
        }
    }
    

    调用方可以完全忽略真正的工厂NumberFactoryImpl和实际的产品BigDecimal,这样做的好处是允许创建产品的代码独立地变换,而不会影响到调用方。

    静态工厂

    一个简单的parse()需要写这么复杂的工厂吗?实际上大多数情况下我们并不需要抽象工厂,而是通过静态方法直接返回产品

    public class NumberFactory {
        public static Number parse(String s) {
            return new BigDecimal(s);
        }
    }
    

    这种简化的使用静态方法创建产品的方式称为静态工厂方法(Static Factory Method)。静态工厂方法广泛地应用在Java标准库中。例如:

    Integer n = Integer.valueOf(100);

    Integer既是产品又是静态工厂。它提供了静态方法valueOf()来创建Integer

    抽象工厂

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    抽象工厂模式和工厂方法不太一样,它要解决的问题比较复杂,不但工厂是抽象的,产品是抽象的,而且有多个产品需要创建,因此,这个抽象工厂会对应到多个实际工厂,每个实际工厂负责创建多个实际产品:

    1. 抽象工厂
    public interface AbstractFactory {
    
        IUser createUser(String name);
    
        IHouse createHouse(Integer age);
    
        static StudentFactory studentFactory = new StudentFactory();
    
        public static AbstractFactory createFactory(){
            if(true){
                return studentFactory;
            }
            //return otherFactory;
            return null;
        }
    }
    
    1. 抽象产品
    public interface IHouse {
    
        String getHouseName();
    
    }
    
    public interface IUser {
    
        String getName();
    
        Integer getAge();
    }
    
    1. 实际产品
    public class StudentUser implements IUser {
        @Override
        public String getName() {
            return null;
        }
    
        @Override
        public Integer getAge() {
            return null;
        }
    }
    
    public class StudentHouse implements IHouse{
        @Override
        public String getHouseName() {
            return null;
        }
    }
    

    4.实际工厂

    public class StudentFactory implements AbstractFactory{
        @Override
        public IUser createUser(String name) {
            return new StudentUser();
        }
    
        @Override
        public IHouse createHouse(Integer age) {
            return new StudentHouse();
        }
    }
    

    总结

    工厂方法用静态工厂替代

    抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;

    抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交道。

    References

  • 相关阅读:
    LeetCode 560. Subarray Sum Equals K (子数组之和等于K)
    25、LinkedList特有方法
    24、List三个子类的特点
    23、数据结构之数组和链表
    22、Vector简介
    21、List遍历时修改元素的问题
    20、List集合中特有的方法
    19、集合概述
    18、Random类简介
    17、enum简介
  • 原文地址:https://www.cnblogs.com/wei57960/p/14530900.html
Copyright © 2020-2023  润新知