• 设计模式之工厂方法模式


    .模式定义:

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。

    UML类图

    二:代码实现

    对下面这段代码进行改造

    public class FactoryMethod {
        public static void main(String[] args) {
            Application application = new Application();
            ProductA product = application.getObject();
            product.method1();
        }
    }
    class ProductA{
        public void method1(){
            System.out.println("ProductA.method1 executed. ");
        }
    }
    class Application{
        private ProductA createProductA(){
            //...init
            //...
            return new ProductA();
        }
        ProductA getObject(){
            ProductA product = createProductA();
            // ...
            return product;
        }
    }

    接下来可能出现ProductB,ProductC...,但都会包含method1方法。接下来就可以使用工厂方法模式。

    先使用简单工厂模式实现,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23GOF设计模式之一。

    public class FactoryMethod {
        public static void main(String[] args) {
            Application application = new Application();
            Product product = application.getObject("1");
            product.method1();
        }
    }
    interface Product{
        public void method1();
    }
    class ProductA implements Product{
        public void method1(){
            System.out.println("ProductA.method1 executed. ");
        }
    }
    class ProductA1 implements Product{
        public void method1(){
            System.out.println("ProductA1.method1 executed. ");
        }
    }
    class SimpleFactory{
        public static Product createProduct(String type){
            if(type.equals("0")){
                return new ProductA();
            }else if(type.equals("1")){
                return new ProductA1();
            }else{
                return null;
            }
        }
    }
    class Application{
        private Product createProduct(String type){
            //...init
            //...
            return SimpleFactory.createProduct(type);
        }
        Product getObject(String type){
            Product product = createProduct(type);
            // ...
            return product;
        }
    }

    下面是工厂方法模式的实现:

    public class FactoryMethod {
        public static void main(String[] args) {
            Application application = new ConcreteProductA();
            Product product = application.getObject();
            product.method1();
        }
    }
    interface Product{
        public void method1();
    }
    class ProductA implements Product{
        public void method1(){
            System.out.println("ProductA.method1 executed. ");
        }
    }
    class ProductA1 implements Product{
        public void method1(){
            System.out.println("ProductA1.method1 executed. ");
        }
    }
    
    abstract class Application{
        abstract Product createProduct();
        Product getObject(){
            Product product = createProduct();
            // ...
            return product;
        }
    }
    class ConcreteProductA extends Application{
    
        @Override
        Product createProduct() {
            //...
            return new ProductA();
        }
    }
    class ConcreteProductA1 extends Application{
    
        @Override
        Product createProduct() {
            //...
            return new ProductA1();
        }
    }

    三:应用场景

    1.当你不知道该使用对象的确切类型的时候。

    2.当你希望为库或框架提供扩展其内部组件的方法时

    四:主要优点

    1.将具体产品和创建者解耦。

    2.符合单一职责原则。

    3.符合开闭原则。

    五:源码中的应用

    // java api
    //静态工厂方法
    
    Calendar.getInstance()
    NumberFormat.getInstance()
    ResourceBundle.getBundle()
    
    //工厂方法
    java.net.URLStreamHandlerFactory
    javax.xml.bind.JAXBContext.createMarshaller
  • 相关阅读:
    8.2
    Telnet远程控制协议
    2020/6/29
    HCIA VRP基础命令(二)
    HCIA VRP基础命令(一)
    解决ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'报错问题
    nginx配置文件nginx.conf
    nginx服务器搭建
    FTP服务器
    NFS
  • 原文地址:https://www.cnblogs.com/kangzhipeng/p/12168727.html
Copyright © 2020-2023  润新知