zoukankan      html  css  js  c++  java
  • 工厂方法模式[Factory Mothod]

    工厂方法模式[Factory Mothod]

    模式定义:

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

    设计模式对稳定的部分提炼出来,成为一种模式。

    应用场景:

    • 1 当你不知道该使用对象的确切类型的时候
    • 2 当你希望库或者框架提供扩展其内部组件的方法时

    主要优点:

    • 1 将具体产品和创建者解耦
    • 2 符合单一职责原则
    • 3符合开闭原则

    工厂方法模式的结构
    工厂方法模式的主要角色如下。
    1:抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
    2:具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
    3:抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
    4:具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

    重构前:

    package factorymethod;
    
    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 createProduct(){
            return new ProductA();
        }
        ProductA getObject(){
            //创建一个实例,并返回
            ProductA product = createProduct();
            return product;
        }
    }
    

    简单工厂重构后:

    package factorymethod;
    
    public class FactoryMethod {
        public static void main(String[] args) {
    
            Application application = new Application();
            Product product1 = application.getObject("0");
            Product product2 = application.getObject("1");
            product1.method1();
            product2.method1();
        }
    }
    
    interface Product{
        public void method1();
    }
    
    class ProductA implements  Product{
        //假设method1是稳定的代码
        @Override
        public void method1(){
            System.out.println("ProductA.method1 executed.");
        }
    }
    
    class ProductA1 implements  Product{
        //假设method1是稳定的代码
        @Override
        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){
    
            return SimpleFactory.createProduct(type) ;
        }
        Product getObject(String type){
            //创建一个实例,并返回
            Product product = createProduct(type);
            return product;
        }
    }
    

    工厂方法的重构:

    package factorymethod;
    
    public class FactoryMethod {
        public static void main(String[] args) {
    
            Application application = new ConcreateProductA1();
            Product product1 = application.getObject();
            product1.method1();
    
        }
    }
    
    interface Product{
        public void method1();
    }
    
    class ProductA implements  Product{
        //假设method1是稳定的代码
        @Override
        public void method1(){
            System.out.println("ProductA.method1 executed.");
        }
    }
    
    class ProductA1 implements  Product{
        //假设method1是稳定的代码
        @Override
        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();
        }
    }
    

    源码中的应用:

    • 静态工厂方法

      Calendar.getInstance()
      java.text.NumberFormat.getInstance()
          
      
    • 工厂方法

      java.net.URLStreamHandlerFactory
      
  • 相关阅读:
    1024X768大图 (Wallpaper)
    (Mike Lynch)Application of linear weight neural networks to recognition of hand print characters
    瞬间模糊搜索1000万基本句型的语言算法
    单核与双核的竞争 INTEL P4 670对抗820
    FlashFTP工具的自动缓存服务器目录的功能
    LDAP over SSL (LDAPS) Certificate
    Restart the domain controller in Directory Services Restore Mode Remotely
    How do I install Active Directory on my Windows Server 2003 server?
    指针与指针变量(转)
    How to enable LDAP over SSL with a thirdparty certification authority
  • 原文地址:https://www.cnblogs.com/zhoujun007/p/13366991.html
Copyright © 2011-2022 走看看