`

3种常见的设计模式

阅读更多
工厂模式:
引用
  定义一个创建产品对象的工厂类,由该工厂统一创建继承了同一个接口的多个产品对象。
  根据创建策略的不同,又分为3种类型。
  ->工厂方法模式:为普通的工厂方法模式。
  ->多个工厂方法模式:提供了多个工厂方法,分别创建不同的产品对象.
  ->静态工厂方法模式:工厂方法是静态的,不需要实例化工厂即可创建产品对象。

  代码分析:
●定义接口
public interface Animal{
					public int sale();
				}

●定义三个具体实现类(数目随意)
			//养猪
				public class Pig implements Animal{
				int price = 10;//价格
				int weight = 200;//重量
				public int sale(){
				return price * weight;
				}
				}
				//养鸡
				public class Chicken implements Animal{
				int price = 5;//价格
				int weight = 20;//重量
				int egg = 20;//鸡蛋
				public int sale(){
				return price * weight + egg;
				}
				}
				//养羊
				public class Sheep implements Animal{
				int price = 10;//价格
				int weight = 100;//重量
				int wool = 50;//羊毛
				public int sale(){
				return price * weight + wool;
				}
				}


●工厂方法模式 类
		public class Farm1{
					public Animal produce(String type){
					if("pig".equals(type)){return new Pig();}
					else if("chicken".equals(type)){return new Chicken();}
					else{return new Sheep();}
					}
				}


●多个工厂方法模式 类
	public class Farm2{
					public Animal producePig(){return new Pig();}
					public Animal produceChicken(){return new Chicken();}
					public Animal produceSheep(){return new Sheep();}
				}


●静态工厂方法模式 类
	public class Farm3{
					public static Animal producePig(){return new Pig();}
					public static Animal produceChicken(){return new Chicken();}
					public static Animal produceSheep(){return new Sheep();}
				}



单例模式:
引用
定义:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类
特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
应用:在线计数器、打印机等
单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。

一、懒汉式单例在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。
单例模式-懒汉式单例
public class LazySingleton {

			// 测试一下单例模式
			public static void main(String[] args) {
				LazySingleton lazySingleton = LazySingleton.getInstance();
				LazySingleton lazySingleton1 = LazySingleton.getInstance();

				if (lazySingleton == lazySingleton1) {
					System.out.println("同一个对象实例");
				} else {
					System.out.println("不是同一个对象实例");
				}
			}

			/*** 私有静态对象,加载时候不做初始化 */
			private static LazySingleton m_intance = null;

			/*** 私有构造方法,避免外部创建实例 */
			private LazySingleton() {
			}
			/*** 静态工厂方法,返回此类的唯一实例.* 当发现实例没有初始化的时候,才初始化. * @return LazySingleton */
			synchronized public static LazySingleton getInstance() {
				if (m_intance == null) {
					m_intance = new LazySingleton();
				}
				return m_intance;
			}
		}


二、饿汉式单例在类加载的时候不创建单例实例。只有在第一次请求实例的时候的时候创建,并且只在第一次创建后,以后不再创建该类的实例。

/*** 单例模式-饿汉式单例 */
			public class EagerSingleton {

				public static void main(String[] args) {
					// 下面来判断一下有没有达到单例效果(系统运行的时候只出来一个空例)
					EagerSingleton eagerSingleton = EagerSingleton.getInstance();
					EagerSingleton eagerSingleton1 = EagerSingleton.getInstance();

					if (eagerSingleton == eagerSingleton1) {
						System.out.println("同一个对象实例");
					} else {
						System.out.println("不是同一个对象实例");
					}
				}

				/** 私有的(private)唯一(static final)实例成员,在类加载的时候就创建好了单例对象 */
				private static final EagerSingleton m_instance = new EagerSingleton();
				/*** 私有构造方法,避免外部创建实例 */
				private EagerSingleton() {
				} // 提供了一个空的构造方法
				/*** 静态工厂方法,返回此类的唯一实例.* @return EagerSingleton */
				public static EagerSingleton getInstance() {
					return m_instance;
				}
			}

三、登记式单例这个单例实际上维护的是一组单例类的实例,将这些实例存放在一个Map(登记薄)中,对于已经登记过的实例,则从工厂直接返回,对于没有登记的,则先登记,而后返回。
import java.util.HashMap;
				import java.util.Map;

				/*** 单例模式- 登记式单例 */
				public class RegSingleton {
					/*** 登记薄,用来存放所有登记的实例 */
					private static Map<String, RegSingleton> m_registry = new HashMap();
					// 在类加载的时候添加一个实例到登记薄
					static {
						RegSingleton x = new RegSingleton();
						m_registry.put(x.getClass().getName(), x);
					}
					/*** 受保护的默认构造方法 */
					protected RegSingleton() {
					}
					/***
					 * 静态工厂方法,返回指定登记对象的唯一实例; 对于已登记的直接取出返回,对于还未登记的,先登记,然后取出返回
					 * 
					 * @param name
					 * @return RegSingleton
					 */
					public static RegSingleton getInstance(String name) {
						if (name == null) {
							name = "RegSingleton";
						}
						if (m_registry.get(name) == null) {
							try {
								m_registry.put(name, (RegSingleton) Class.forName(name)
										.newInstance());
							} catch (InstantiationException e) {
								e.printStackTrace();
							} catch (IllegalAccessException e) {
								e.printStackTrace();
							} catch (ClassNotFoundException e) {
								e.printStackTrace();
							}
						}
						return m_registry.get(name);
					}

					/** * 一个示意性的商业方法 * @return String */
					public String about() {
						return "Hello,I am RegSingleton!";
					}
				}



代理模式:
引用
代理模式的作用:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到的角色有:
抽象角色:
声明真实对象和代理对象的共同接口;
代理角色:
代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:
代理角色所代表的真实对象,是我们最终要引用的对象。


实例:
抽象角色:
	 //生产商
				abstract public class Subject{ 
					abstract public void request(); //生产手机
				} 


真实角色:实现了Subject的request()方法。
public class RealSubject extends Subject { 
					public RealSubject() { 
					} 
					public void request() { 
						System.out.println("From real subject."); 
					} 
				} 


代理角色:
public class ProxySubject extends Subject { 
					private RealSubject realSubject;
					//以真实角色作为代理角色的属性 
					public ProxySubject() { 
					} 

					//该方法封装了真实对象的request方法
					public void request()  { 
						preRequest(); 
						if( realSubject == null ) { 
							realSubject = new RealSubject(); 
						} 
						realSubject.request(); //此处执行真实对象的request方法 
						postRequest(); 
					}

					private void preRequest() { 
						//something you want to do before requesting 
					} 

					private void postRequest() { 
						//something you want to do after requesting 
					} 
				} 

			客户端调用: 
				Subject sub=new ProxySubject(); 
				Sub.request(); 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    c#几种常用的设计模式

    以下是对标题和描述中提到的几种常用C#设计模式的详细解释: 1. **单例模式(Singleton)**: - 单例模式确保一个类只有一个实例,并提供全局访问点。在C#中,通常通过私有化构造函数和静态成员来实现。这样可以...

    23种设计模式整理pdf

    设计模式详解 设计模式是软件开发中的一...在本文中,我们对23种常见的设计模式进行了整理和解释,每种模式都有其优点和缺点,开发者可以根据实际情况选择合适的设计模式,以提高代码的可重用性、可维护性和可扩展性。

    23种面向对象设计模式

    面向对象设计模式是软件开发中的一种重要思想,它通过总结和提炼在软件设计过程中常见的问题和解决方案,形成了可复用的设计规范。标题提到的“23种面向对象设计模式”涵盖了设计模式的主要分类,这些模式在Java、...

    九种常用设计模式的应用!

    这篇博客“九种常用设计模式的应用!”探讨了九种常见的设计模式,并结合实际开发场景阐述了它们的应用。以下是对这些设计模式的详细介绍: 1. **单例模式**(Singleton):保证一个类只有一个实例,并提供一个全局...

    浅析23种软件设计模式

    下面我们将对23种常见的软件设计模式进行浅析。 1. 工厂模式:工厂模式的主要思想是将客户类和工厂类分开,客户类可以向工厂类请求某种产品,而工厂类则负责生产该产品。这种模式的优点是客户类无须修改就可以接纳...

    24种设计模式以及混合设计模式

    设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而形成的一套最佳实践。在本文中,我们将深入探讨24种设计模式,并结合混合设计模式的概念,以及它们在实际项目中的应用案例。 首先,设计...

    9种常用设计模式收集

    这里提到的"9种常用设计模式收集"涵盖了Java Web开发和Android开发中的一些核心设计原则,通过深入理解并应用这些模式,开发者可以提高代码的可读性、可维护性和可扩展性。 1. **单例模式**:单例模式确保一个类...

    C++ 23种设计模式1

    设计模式是经过时间和实践验证的解决方案,它们针对常见的编程问题提供了一套标准的模板,使得开发者能够更高效地编写可复用、可维护的代码。以下是针对23种设计模式的概述,以及C++中的实现。 **创建型模式**关注...

    Java之23种设计模式解析

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和最佳实践。本资源“Java之23种设计模式解析”源自尚硅谷教育机构,由宋红康老师主讲的“玩转Java”系列课程。这份资料详细介绍了...

    23种Java设计模式和15种J2EE设计模式.pdf

    在深入探讨《23种Java设计模式和15种J2EE设计模式》这一主题之前,我们首先需要明确设计模式的概念及其在软件工程中的重要性。设计模式是一种在特定情境下解决问题的模板,它描述了在软件设计中遇到的问题以及解决...

    20种常见设计模式的C++实现

    本资源"20种常见设计模式的C++实现"涵盖了一些最核心的设计模式,以下是这些模式的详细介绍: 1. **单例模式(Singleton)**:确保一个类只有一个实例,并提供一个全局访问点。在C++中,通常通过私有构造函数和静态...

    GOF23种设计模式

    设计模式是软件工程中经过长期实践验证的解决常见问题的有效方案,它们是经验的结晶,为软件设计提供了可复用的结构和模式。GOF(GoF)23种设计模式,是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides...

    JAVA21种设计模式

    在软件开发中,设计模式是一种被广泛接受的解决方案,用于解决常见的设计问题。这些模式是经验丰富的开发者在实践中总结出来的,它们为复杂问题提供了一种标准化的方法。Java的21种设计模式涵盖了创建型、结构型和...

    23种设计模式(C++).pdf

    《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》是一本深入探讨软件设计模式的书籍,它涵盖了创建型、结构型和行为型三种主要类型的23个经典设计模式,并提供了C++语言的实现代码。设计模式是软件工程中的...

    设计模式 23种设计模式PPT

    - 工厂模式:工厂方法模式是一种常见的创建型模式,它定义了一个创建对象的接口,但允许子类决定实例化哪一个类。这样,工厂方法可以将对象创建的责任推延到子类,使得子类能够控制实例化过程。 - 抽象工厂模式:...

    几种设计模式的理解设计模式理解

    设计模式是软件开发中的一种重要概念,用于解决常见的设计问题并提供可复用的解决方案。以下是对几种设计模式的详细理解和应用。 1. 工厂模式 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在这...

    12种常用设计模式代码实现

    设计模式是软件工程中的一种最佳实践,用于解决常见的设计问题并提供可重用的解决方案。在给定的压缩包文件中,包含了12种常用的设计模式的代码实现,这些都是面向对象编程中的核心概念,对于提升代码质量、可维护性...

    java之23种设计模式完整代码

    设计模式是经过时间考验的解决方案模板,用来解决常见的软件设计问题。在Java中,这23种设计模式分为三大类:创建型、结构型和行为型。 1. **创建型设计模式**: - **单例模式**:确保一个类只有一个实例,并提供...

    C# 23种设计模式(中文高清带书签)

    《C# 23种设计模式》是一本深入解析C#编程中常用设计模式的权威指南,对于想要提升代码质量、提高软件可维护性的开发者来说,是不可或缺的参考资料。书中详细介绍了23种经典的设计模式,这些模式是软件工程实践中...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作...

Global site tag (gtag.js) - Google Analytics