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
      
  • 相关阅读:
    晋IT分享成长沙龙集锦
    Spring、Hibernate 数据不能插入到数据库问题解决
    fancybox关闭弹出窗体parent.$.fancybox.close();
    关于Javakeywordsynchronized——单例模式的思考
    MySQL Study之--MySQL压力測试工具mysqlslap
    cocos2d-x 3.3 之卡牌设计 NO.4 定时器的使用(清理内存)
    【v2.x OGE教程 16】 Modifier使用相关
    [Python网络编程]浅析守护进程后台任务的设计与实现
    hdu 4778 Gems Fight!
    nginx负载均衡向后台传递參数方法(后端也是nginxserver)
  • 原文地址:https://www.cnblogs.com/zhoujun007/p/13366991.html
Copyright © 2011-2022 走看看