zoukankan      html  css  js  c++  java
  • 设计模式之工厂模式

          前两篇博客阅读量不行,让自己反思是不是博客质量不行呢,文字功底不行呢?算了不管这些东西了,反正我写博客也是为了提高、总结自己,无其他!

          今天这篇博客我想要来写一写设计模式里面的工厂模式,其实说到工厂模式大家应该不会陌生。的确,在笔者还是个菜鸟的时候,还不理解设计模式到底是用来干什么的时候,工厂模式的大名就已经入耳。那么工厂模式到底是用来干什么的呢?在代码层面应该怎样来写呢?下面就让笔者通过一个例子来加以说明。

          假设在一个汽车工厂里面可以同时生产宝马、奔驰、奥迪,当然心情好的话,也是可以扩展业务生产些兰博基尼、玛莎拉蒂什么的。我们先别管这家神奇的工厂有没有这个生产实力,我们在这里只管它的业务范围。假设每辆汽车的出厂标准都是具有属性速度、颜色、型号,具有方法驾驶、刹车。下面就让我们通过代码来模拟一下这个场景,首先肯定需要申明一个接口Car,定义如下:

    public interface Car{
          int getColor();
          float getSpeed();
          String getModel();
          void run();
          void stop();
    }

    接下来我们肯定通过上面的接口来扩展出宝马、奔驰、奥迪等车型了,代码如下:

    public class BMW implements Car {
    
    	@Override
    	public void run() {
    		System.out.println("宝马开始跑...");
    	}
    
    	@Override
    	public void stop() {
    		// TODO Auto-generated method stub
    		System.out.println("宝马刹车...");
    	}
    
    	@Override
    	public int getColor() {
    		// TODO Auto-generated method stub
    		return Color.red;
    	}
    
    	@Override
    	public float getSpeed() {
    		// TODO Auto-generated method stub
    		return 60;
    	}
    
    	@Override
    	public String getModel() {
    		return "BMW";
    	}
    
    }
    
    public class Benzimplements Car {
    
    	@Override
    	public void run() {
    		System.out.println("奔驰开始跑...");
    	}
    
    	@Override
    	public void stop() {
    		// TODO Auto-generated method stub
    		System.out.println("奔驰刹车...");
    	}
    
    	@Override
    	public int getColor() {
    		// TODO Auto-generated method stub
    		return Color.black;
    	}
    
    	@Override
    	public float getSpeed() {
    		// TODO Auto-generated method stub
    		return 70;
    	}
    
    	@Override
    	public String getModel() {
    		return "Benz";
    	}
    
    }
    public class Audi implements Car {
    
    	@Override
    	public void run() {
    		System.out.println("奥迪开始跑...");
    	}
    
    	@Override
    	public void stop() {
    		// TODO Auto-generated method stub
    		System.out.println("奥迪刹车...");
    	}
    
    	@Override
    	public int getColor() {
    		// TODO Auto-generated method stub
    		return Color.blue;
    	}
    
    	@Override
    	public float getSpeed() {
    		// TODO Auto-generated method stub
    		return 80;
    	}
    
    	@Override
    	public String getModel() {
    		return "Audi";
    	}
    
    }
    

    通过上面的代码我们就已经定义好了三种车型,接下来我们就应该考虑该如何进行生产了。有两种常做的办法:1.当我们需要哪个车型的时候,就直接new;2.就是通过工厂模式,进行生产;当然最优的方法肯定是工厂模式了,为什么?采用new的方法进行生产,肯定就违反了迪米特原则,整个代码体系里面就缺少一个高内聚性,每当我需要一个车型就得找到这个车型new。而工厂模式呢,可以很好的为我们解决这个弊端。下面就让我们来看看,工厂模式的代码,首先声明一个抽象的车型工厂:

    public abstract class AbstractCarFactory {
    
    	public abstract <T extends Car> T createCar(Class<T> c);
    }
    

    然后实现一个真正的生产工厂,代码如下:

    public class CarFactory extends AbstractCarFactory {
    
    	@Override
    	public <T extends Car> T createCar(Class<T> c) {
    		Car car=null;
    		try{
    			car=(T)Class.forName(c.getName()).newInstance();
    		}catch(Exception e){
    			System.out.println("汽车生成错误");
    		}
    return (T)car; } }

    最后我们就可以调用该工厂类进行车型的生产制造了,代码如下:

    public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		AbstractCarFactory carFactory=new CarFactory();
    		Car bmwCar= carFactory.createCar(BMW.class);
    		bmwCar.run();
    		bmwCar.stop();
    		
    		Car benzCar=carFactory.createCar(Benz.class);
    		benzCar.run();
    		benzCar.stop();
    		
    		Car audiCar=carFactory.createCar(Audi.class);
    		audiCar.run();
    		audiCar.stop();
    	}
    

    通过上面的代码,可以发现生产新的车型将变得非常简单,我们只要扩展新的Car,然后在main方法里面传入对应的类名即可。通过应用工厂模式,可以很好的降低代码之间的耦合,同时也符合6大原则里面迪米特原则、依赖倒置原则。下面让我们来看看工厂模式的扩展:简单工厂模式,多个工厂模式,替代单例模式,延迟初始化。

          简单工厂模式:就是上面的抽象工厂类去掉,同时将里面的创建类移到真正的工厂类里面;

          多个工厂模式:就是将工厂类进行拆分,不同的工厂类只生产一种产品;

          替代单例模式:应该很好理解了;

          延迟初始化:当我们需要一个对象的时候,才会去调用工厂进行初始化;

          好了,今天的博客就到这里了。如果有什么不对的地方欢迎大家拍砖,后续有时间我也会继续更新。

  • 相关阅读:
    python2.7 目录下没有scripts
    pycharm配置appium 提示unsrsloved reference
    查看cookie的快捷方法
    在线linux 平台
    selenium配置Chrome驱动
    ImportError: sys.meta_path is None, Python is likely shutting down
    基本控件文档-UISwitch属性---iOS-Apple苹果官方文档翻译
    基本控件文档-UISlider属性---iOS-Apple苹果官方文档翻译
    基本控件文档-UISegment属性----iOS-Apple苹果官方文档翻译
    基本控件文档-UILabel属性---iOS-Apple苹果官方文档翻译
  • 原文地址:https://www.cnblogs.com/xiaocai20091687/p/xiaocai_design_three.html
Copyright © 2011-2022 走看看