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

    对于java的设计模式,我还是第一次认认真真的总结,以前用的时候都不曾留意细节,现在回头再看只知道该怎么设计,却忘记当时为嘛要用它了,

    所以这次就做一个demo来再次复习总结一下,希望从中能学到新体悟。先说说设计模式最重要的一个原则吧,就是开闭原则:意思是对扩展开放,对修改关闭

    在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。

    想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到这点。

    1、简单的工厂模式

    以小明,小雨吃饭睡觉为例:

    首先创建一个Human.java接口,该接口的作用相当于女娲造人,它为人类定义了吃饭睡觉的能力

    public interface Human {
    
    	public abstract void sleep();
    
    	public abstract void eat();
    
    }
    

    Xiaoming.java,实现了Human接口

    public class Xiaoming implements Human {
    	
    
    	public void sleep(){
    		System.out.println(" ----小明睡觉了---- ");
    	}
    
    	public void eat(){
    		System.out.println(" ----小明吃饭了!---- ");
    	}
    }
    

     Xiaoyu.java同上

    public class Xiaoyu implements Human {
    
    	public void sleep() {
    		System.out.println("小雨睡觉了");
    
    	}
    
    	public void eat() {
    		System.out.println("小雨吃饭了");
    
    	}
    
    }
    

     最后我们建个工厂类HumanFactory.java

        public class HumanFactory(){
    
              public Human getHuman(String name){
    
                  if("Xiaoming".equals(name)){
                       return new Xiaoming();
                  }esle if("Xiaoyu".equals(name)){
                       return new Xiaoyu();
                    }else{
                      return null;
                    }
                }
    
          }
    
        
    

     测试类:

    public class HumanTest{
    
    	@Test
    	public void test1(){
    		HumanFactory provider = new HumanFactory();
    		Human xiaoming = provider.getHuman("xiaoming");
    		xiaoming.sleep();
    	}
    }
    

     输出:----小明睡觉了----

    2、多个工厂模式

    多个工厂模式是对简单工厂模式的改进,对HumanFactory.java做一下修改就可以了:

    public class CarFactory {
    
    	public Car getXiaoming(){
    		return new Xiaoming();
    	}
    	public Car getXiaoyu(){
    		return new Xiaoyu();
    	}
    }
    

     测试类:

    public class HumanTest{
    
    	@Test
    	public void test1(){
    		HumanFactory provider = new HumanFactory();
    		Human xiaoming = provider.getXiaoming();
    		xiaoming.sleep();
    	}
    }
    

     输出:----小明睡觉了----

    3、静态 工厂模式,同样对HumanFactory.java做一下修改就可以了:

    public class CarFactory {
    
    	public static Car getXiaoming(){
    		return new Xiaoming();
    	}
    	public static Car getXiaoyu(){
    		return new Xiaoyu();
    	}
    }
    

     测试类:

    public class HumanTest{
    
    	@Test
    	public void test1(){
    		Human xiaoming = HumanFactory.getXiaoming();
    		xiaoming.sleep();
    	}
    }
    

      输出:----小明睡觉了----

    总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。

    在以上的三种模式中,第一种如果传入的字 符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,

    所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

    4、抽象工厂模式

    同样的以Human为例:

    首先创建同一接口:

    public interface Human {
    
    	public abstract void sleep();
    
    	public abstract void wakeup();
    
    }
    

     一下两个类:

    public class Xiaoming implements Human {
    	
    
    	public void sleep(){
    		System.out.println(" ----小明睡觉了---- ");
    	}
    
    	public void wakeup(){
    		System.out.println(" ----小明醒了!---- ");
    	}
    }
    
    public class Xiaoyu implements Human {
    
    	public void sleep() {
    		System.out.println("小雨睡觉了");
    
    	}
    
    	public void wakeup() {
    		System.out.println("小雨睡醒了");
    
    	}
    
    }
    

     提供两个工厂类

    public class XiaomingFactory implements FactoryProvider{
    
    	public Human produce() {
    		return new Xiaoming();
    	}
    
    }
    
    public class XiaoyuFactory implements FactoryProvider{
    
    	public Human produce() {
    		return new Xiaoyu();
    	}
    }
    

     实现同一个接口:

    public interface FactoryProvider {
    	
    	public Human produce();
    }
    

     测试类:

    public class HumanTest{
    
    	@Test
    	public void test1(){
    		FactoryProvider provider = new XiaomingFactory();
    		Human xiaoming = provider.produce();
    		xiaoming.sleep();
    	}
    }
    

     输出:小明睡觉了。

    其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。

    这样做,拓展性较好!

  • 相关阅读:
    获取网站IP地址(Linux,C)
    linux_c_udp_example
    linux_c_tcp_example
    golang-sort
    docker_jenkins
    依赖抽象,而不要依赖具体实现
    网络杂记
    游戏开发中遇到的问题
    随手杂记
    go多态
  • 原文地址:https://www.cnblogs.com/wcyBlog/p/4040467.html
Copyright © 2011-2022 走看看