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

    设计模式系列(四)---工厂模式

    目录

    工厂模式的种类

    • 工厂模式分为两类:工厂方法模式和抽象工厂模式
    • 简单工厂是工厂方法模式的一种特例

    简单工厂模式

    代码实现

    
    abstract class Person
    {
    	public abstract void sayHello();
    }
    
    class GDPerson extends Person
    {
    	public void sayHello()
    	{
    		System.out.println("我是广东人");
    	}
    }
    
    class BJPerson extends Person
    {
    	public void sayHello()
    	{
    		System.out.println("我是北京人");
    	}
    }
    class PersonFactory
    {
    	static final int GD=1;
    	static final int BJ=2;
    	public static Person createPerson(int area)
    	{
    		switch (area)
    		{
    			case GD:
    				return new GDPerson();
    			case BJ:
    				return new BJPerson();
    			default:
    				return null;
    		}
    	}
    }
    public class Demo5 {
    	public static void main(String[] args) {
    		Person gdPerson=PersonFactory.createPerson(PersonFactory.GD);
    		gdPerson.sayHello();
    		Person bjPerson=PersonFactory.createPerson(PersonFactory.BJ);
    		bjPerson.sayHello();
    	}
    }
    
    

    开放封闭原则

    • 开放封闭原则是面向对象原则的核心
    • 对扩展开放,意味着需求或变化是们可以对现有代码进行扩展,以适应新的情况
    • 对修改封闭,意味这类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改

    分析

    • 传入要创建的对象的类型,然根据传入的类型,创建相应的对象

    • 调用者不必知道对象是如何创建的,只要传入相应的参数就可以

    • 但是,如果这个时候需要添加其他的type,那么就要增加case,也就是对设计完成的类进行修改,而这样就违背了开放封闭原则

    工厂方法模式

    代码实现

    public interface PersonFactory
    {
    	Person createPerson();
    }
    class GDFactory implements PersonFactory
    {
    
    	public Person createPerson() {
    		return new GDPerson();
    	}
    	
    }
    class BJFactory implements PersonFactory
    {
    	public Person createPerson()
    	{
    		return new BJPerson();
    	}
    }
    
    public class Demo5 {
    	public static void main(String[] args) {
    		PersonFactory gdFactory=new GDFactory();
    		Person gdPerson=gdFactory.createPerson();
    		PersonFactory bjFactory=new BJFactory();
    		Person bjPerson=bjFactory.createPerson();
    		
    	}
    }
    

    分析

    • 定义一个用于创建对象的接口,让子类决定实例化哪个类,在这里体现为创建一个PersonFactory接口,根据要实例化的类(Person的类型),创建实现这个接口的一个工厂类(BJFactory或者是GDFactory)。
    • 这样的话,当增加一个新的类的时候,不用对一个已经设计完成的类进行修改,这样就不会破坏开放封闭原则。
    • 但是随着类的增多(比如SHPeroson和USAPerson),那么就要对应创建多个工厂类

    抽象工厂模式

    abstract class Animal
    {
    	public abstract void sayHello();
    }
    
    class Cat extends Animal
    {
    	public void sayHello()
    	{
    		System.out.println("瞄");
    	}
    }
    public interface Factory
    {
    	Person createPerson();
    	Animal createAnimal();
    }
    
    class Factory1 implements Factory
    {
        public Person createPerson()
    	{
    		return new BJPerson();
    	}
    	public Animal createAnimal()
    	{
    	    return new Cat();
    	}
    }
    

    分析

    • 对比工厂方法模式。它与工厂方法唯一的区别就是工厂的接口里是不再是创建一个类型(不止是Person还有Animal)。

    对比

    • 可以体会到,创建一个实例的时候,我们将判断的逻辑放到工程的类的内部(switch或者if else)。而工厂方法模式的话,则是将判断的逻辑转移到客户端,要创建什么类型的实例,就创建对应的工厂来获取对象。

    我觉得分享是一种精神,分享是我的乐趣所在,不是说我觉得我讲得一定是对的,我讲得可能很多是不对的,但是我希望我讲的东西是我人生的体验和思考,是给很多人反思,也许给你一秒钟、半秒钟,哪怕说一句话有点道理,引发自己内心的感触,这就是我最大的价值。(这是我喜欢的一句话,也是我写博客的初衷)

    作者:jiajun 出处: http://www.cnblogs.com/-new/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。

  • 相关阅读:
    Tomcat 配置用户认证服务供C#客户端调用
    Solr与HBase架构设计
    一个自定义MVP .net框架 AngelFrame
    Dell R720上的系统安装问题的解决办法(关于RAID建立磁盘阵列的技术)
    中文分词器性能比较
    关于RabbitMQ关键性问题的总结
    js基本类型与引用类型,浅拷贝和深拷贝
    sass初学入门笔记(一)
    Emmet插件比较实用常用的写法
    今天发现新大陆:haml和Emmet
  • 原文地址:https://www.cnblogs.com/-new/p/7532971.html
Copyright © 2011-2022 走看看