• 工厂模式


    *概述:

    • 在创建一个对象时,不向客户端暴露内部细节,并提供一个创建对象的通用接口

    1. 简单工厂

    • 把实例化的操作单独放到一个类中,整个类就成为简单工厂类,让简单工厂决定应该使用哪个具体子类来实例化
    • 优点:客户并不需要直到子类的细节以及应当实例化哪个,而当子类发生修改时,也并不需要客户进行修改
    public class SimpleFactory {
    
        public Product createProduct(int type) {
            if (type == 1) {
                return new ConcreteProduct1();
            } else if (type == 2) {
                return new ConcreteProduct2();
            }
            return new ConcreteProduct();
        }
    }
    public class Client {
    
        public static void main(String[] args) {
            SimpleFactory simpleFactory = new SimpleFactory();
            Product product = simpleFactory.createProduct(1);
            // do something with the product
        }
    }

    2. 工厂方法

    • 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法将类的实例化延迟到其之类
    • 与简单工厂模式的区别:
      • 简单工厂模式在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了具体产品的依赖。
      • 但是需要增加新功能时,需要修改原有的类,违背了开放-封闭原则。
    public abstract class Factory {
        abstract public Product factoryMethod();
        public void doSomething() {
            Product product = factoryMethod();
            // do something with the product
        }
    }
    public class ConcreteFactory1 extends Factory {
        public Product factoryMethod() {
            return new ConcreteProduct1();
        }
    }
    public class ConcreteFactory2 extends Factory {
        public Product factoryMethod() {
            return new ConcreteProduct2();
        }
    }
    public class ConcreteFactory3 extends Factory {
        public Product factoryMethod() {
            return new ConcreteProduct3();
        }
    }

    3. 抽象工厂

    • 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
    • 继承父类工厂的不同子类,分别新建不同的实例,当实例不同的子类时,就可以new不同的类了
    public class AbstractProductA {
    }
    public class AbstractProductB {
    }
    public class ProductA1 extends AbstractProductA {
    }
    public class ProductA2 extends AbstractProductA {
    }
    public class ProductB1 extends AbstractProductB {
    }
    public class ProductB2 extends AbstractProductB {
    }
    public abstract class AbstractFactory {
        abstract AbstractProductA createProductA();
        abstract AbstractProductB createProductB();
    }
    public class ConcreteFactory1 extends AbstractFactory {
        AbstractProductA createProductA() {
            return new ProductA1();
        }
    
        AbstractProductB createProductB() {
            return new ProductB1();
        }
    }
    public class ConcreteFactory2 extends AbstractFactory {
        AbstractProductA createProductA() {
            return new ProductA2();
        }
    
        AbstractProductB createProductB() {
            return new ProductB2();
        }
    }
    public class Client {
        public static void main(String[] args) {
            AbstractFactory abstractFactory = new ConcreteFactory1();
            AbstractProductA productA = abstractFactory.createProductA();
            AbstractProductB productB = abstractFactory.createProductB();
            // do something with productA and productB
        }
    }
  • 相关阅读:
    C#加密解密
    软件推广常去网站
    C#双缓冲
    C#截图相关代码
    C# 如何在空间运行时调整控件位置和大小
    微信小程序蓝牙打印机demo
    解决办法 not Signedoffby author/committer/uploader in commit message footer
    C# 多线程任务 Task
    2019 TFUG 成都 Coding Lab 圆满结束
    微信小程序元素的定位相对绝对固定
  • 原文地址:https://www.cnblogs.com/BitingCat/p/10541038.html
Copyright © 2020-2023  润新知