zoukankan      html  css  js  c++  java
  • 设计模式(3)---工厂模式

    在这里插入图片描述

    上一篇:单例模式

    1.什么是工厂模式?

       工厂模式是我们平时较常使用得一种设计模式,它实现了创建者与调用者分离。在工厂模式中,我们在创建对象得时候不会对客户端暴露创建逻辑,并且是通过使用一个共同得接口来指向新创建得对象。

       太官方了,整不懂?大白话就是:你买一个手机,直接从手机生产商那里提货用就行了,不用去管它手机内部是怎么构建得,功能是怎么实现得。

    2.什么时候使用工厂模式?

      工厂模式并不是任何时候都适合使用的,工厂模式在创建复杂的对象的适合更加适合使用,如果是普通对象直接new就完事了。因为使用工厂模式就需要引入一个工厂类,增加了系统的复杂度。

    3.工厂模式分类?

    1.简单工厂模式
      用来生产同一等级结构中的任意产品 。

    在这里插入图片描述

    /**
     *简单工厂---Car接口
     */
    public interface Car {
    
    	void name();
    }
    
    public class BenChi implements Car {
    
    	@Override
    	public void name() {
    		System.out.println("奔驰车");
    	}
    }
    
    public class BaoMa implements Car {
    
    	@Override
    	public void name() {
    		System.out.println("宝马车");
    	}
    }
    
    /**
     * 普通的方式---测试类
     */
    public class Test {
    
    	public static void main(String[] args) {
    		Car car=new BenChi();
    		Car car1 = new BaoMa();
    		car.name();
    		car1.name();
    	}
    }
    

    将上面的测试类使用工厂模式来进行改造:

    首先创建一个Car工厂类,用于获取Car。

    /**
     * Car工厂类
     */
    public class CarFactory {
    
    	//获取Car的方法
    	public static Car getCar(String carName) {
    		if (carName.equals("benchi")) {
    			return new BenChi();
    		} else if (carName.equals("baoma")) {
    			return new BaoMa();
    		} else {
    			return null;
    		}
    	}
    }
    
    

    然后编写测试类:

    public class Test01 {
    
    	public static void main(String[] args) {
    		Car benchi = CarFactory.getCar("benchi");
    		Car baoma = CarFactory.getCar("baoma");
    
    		benchi.name();
    		baoma.name();
    
    	}
    }
    

    以上代码分别使用了普通new对象的方法获取车工厂模式获取车两种不同的方式。

      但是如果现在我们想要一个大众车,那就需要去CarFactory中修改逻辑代码,这不符合OOP中的开闭原则(对扩展开放,对修改关闭),如果想要符合开闭原则,方便横向扩展,则可以使用工厂方法模式

    2.工厂方法模式
      用来生产同一等级结构中的固定产品。

    在这里插入图片描述

    1)修改CarFactory,注意是interface

    /**
     * Car工厂类
     */
    public interface CarFactory {
    
    	Car getCar();
    }
    

    2)创建一个新的BaoMaFactory

    public class BaoMaFactory implements CarFactory {
    
    	@Override
    	public Car getCar() {
    		return new BaoMa();
    	}
    }
    

    3)创建一个新的BenChiFactory

    public class BenChiFactory implements CarFactory {
    
    	@Override
    	public Car getCar() {
    		return new BenChi();
    	}
    }
    

    4)测试类

    public class Test02 {
    
    	public static void main(String[] args) {
    
    		Car baoma = new BaoMaFactory().getCar();
    		Car benchi  = new BenChiFactory().getCar();
    		
    		baoma.name();
    		benchi.name();
    	}
    }
    

      使用此种模式代码量明显比第一种代码量多,但是此种方式方便我们横向扩展,此时如果我们需要的是大众车,直接新创建一个DaZhongFactory就行了,不需要去修改原来的代码,符合开闭原则

      此种方式虽然满足了开闭原则,能够非常简单的实现横向扩展,但是!

      相信大家已经发现此种方式的弊端:如果我要10个车那就需要new 10个对应的车的工厂类。100个就需要100个对应车的工厂类……它让我们的整个项目体系更加复杂化了,所以工厂模式在实际的应用中简单工厂类反而使用的较多。

    3.抽象工厂模式
      围绕一个超级工厂创建其他厂,这个超级工厂可以看作是其他工厂的工厂。

      抽象工厂模式虽然也是工厂模式的一种,但是两者本质上还是有区别的。所以在设计模式中,我们也将抽象工厂模式工厂模式分开为两种不同的创建对象的模式。

    下一篇:抽象工厂模式

  • 相关阅读:
    Effective Java 19 Use interfaces only to define types
    Effective Java 18 Prefer interfaces to abstract classes
    Effective Java 17 Design and document for inheritance or else prohibit it
    Effective Java 16 Favor composition over inheritance
    Effective Java 15 Minimize mutability
    Effective Java 14 In public classes, use accessor methods, not public fields
    Effective Java 13 Minimize the accessibility of classes and members
    Effective Java 12 Consider implementing Comparable
    sencha touch SortableList 的使用
    sencha touch dataview 中添加 button 等复杂布局并添加监听事件
  • 原文地址:https://www.cnblogs.com/wgty/p/12810438.html
Copyright © 2011-2022 走看看