设计模式的简单示例
来源:互联网 发布:汽车pp2000软件下载 编辑:程序博客网 时间:2024/05/21 23:16
设计模式,按用途分可以分为三种,分别是:
1.创建型模式(如何创建对象以及何时创建对象)
2.结构型模式(对象该如何组织以及采用什么样的结构更合理)
3.行为型模式(规定了各个对象应该具备的职责以及对象间的通信模式)
下面简单说说自己对其中几个典型模式的浅表理解
工厂方法模式(创建型模式)
由一个工厂类根据传入的参数决定创建出哪一种产品类的实例,
案例:
实现一个乳品生产公司控制鲜奶和酸奶的生产过程
分析:
创建产品接口,包含生产工艺和产品特征两个方法。鲜奶类和酸奶类实现产品接口。
使用多态,创建工厂接口,然后创建各个工厂类
产品接口:
public interface Product{
void craftwork();//工艺
void type();//产品特征
}
鲜奶类:
public class Creamery implements Product{
public void craftwork(
System.out.println(“牛奶+除菌=鲜奶”);
)
public void type(
System.out.println(“原味浓香!”);
)
}
酸奶类:
public class Yoghuort implements Product{
public void craftwork(
System.out.println(“牛奶+酵母菌+糖=酸奶”);
)
public void type(
System.out.println(“酸甜可口!”);
)
}
工厂接口:
public interface ProductFactory {
Product factory();//返回值为产品接口类型
}
鲜奶工厂:
public class CreameryFactory implements ProductFactory {
@Override
public Product factory() {
System.out.println("生产鲜奶");
return new Creamery();
}
}
酸奶工厂:
public class YoghuortProduct implements ProductFactory {
@Override
public Product factory() {
System.out.println("生产酸奶!");
return new Yoghuort();
}
}
测试类:
public class Test {
public static void main(String[] args) {
ProductFactory y=new CreameryFactory();
y.factory().craftwork();
y.factory().type();
ProductFactory c=new YoghuortProduct();
c.factory().craftwork();
c.factory().type();
}
}
单例模式(创建型模式)
1.私有构造函数。
将构造函数“隐藏”起来,可以防止在类的外部使用new关键字创建类的实例
2.保存唯一实例的静态的私有变量。如uniqueInstance变量
3.获取唯一实例的静态方法
如:使用静态方法getInstance()返回类的实例,达到全局可见的效果。
懒汉式单例:(在静态方法中加一个synchronized关键字)
饿汉式单例:(定义静态变量的同时实例化)
案例:
使用单例模式实现歌曲播放:
(双击歌曲的时候系统会默认打开一个播放器进行播放,而不是同时打开多个窗口)
1.定义一个播放器类,实例化一个唯一的播放器
public class MediaPlayer {
/*静态属性指向唯一实例*/
private static MediaPlayer uniqueInstance=null;
/*私有构造函数*/
private MediaPlayer(){
}
/*提供唯一实例*/
public synchronized static MediaPlayer getInstance(){//懒汉式单例保证该代码是线程安全的
if(uniqueInstance==null){
uniqueInstance=new MediaPlayer();
}
return uniqueInstance;
}
/*歌曲播放方法*/
public void Play(String url){
System.out.println("开始播放歌曲,歌曲路径为"+url);
}
}
2.Test类(模拟音乐播放)
public class Test {
public static void main(String[] args) {
//获取播放器
MediaPlayer player=MediaPlayer.getInstance();
//播放歌曲
player.Play("F:\\My Music\\****.mp3");
}
}
代理模式(结构型模式)
首先创建一个抽象主题,然后创建一个真实主题继承抽象主题,一个代理主题,也要继承抽象主题,并控制真实主题的引用。
1.抽象主题:
public abstract class Subject {
//声明一个抽象 的请求方法
abstract public void request();
}
2.真实主题:(继承抽象主题)
public class RealSubject extends Subject {
public void request() {
System.out.println("实现请求!");
}
}
3.代理主题:(控制对真实主题的引用)
public class ProxySubject extends Subject {
private RealSubject realSubject;//声明一个真实主题类型 的成员变量
*请求前的方法
public void preRequest(){
System.out.println("请求前的 操作!");
}
*请求后的方法
public void postRequest(){
System.out.println("请求后的操作!");
}
public void request() {
preRequest();
if(realSubject==null){
realSubject=new RealSubject();//实例化成员变量
}
realSubject.request();
postRequest();
}
}
4.Test类
public class Test {
public static void main(String[] args) {
Subject subject=new ProxySubject();
subject.request();
}
}
输出:
请求前的操作!
实现请求!
请求后的操作!
策略模式(行为型模式)
案例:购物时,普通顾客不打折,会员九折,VIP打八折
1.抽象策略类:
public abstract class Account {
public abstract float getFactPricce(int amount, int price); //获取实际价格的抽象方法
}
2.普通顾客的商品价格计算类:
public class CommonAccount extends Account {
public float getFactPricce(int amount, int price) {
return amount*price;
}
}
3.会员顾客的商品价格计算类:
public class InsiderAccount extends Account {
public float getFactPricce(int amount, int price) {
//打九折
return amount*price*9/10;
}
}
4.vip会员的商品价格计算类:
public class VipAccount extends Account {
public float getFactPricce(int amount, int price) {
return amount*price*8/10;
}
}
5.测试类:
public class Test {
public static void main(String[] args) {
String name="CD";
int price=50;
int amount=2;//购买数量
float sum=0;//实际应付价格
//普通顾客
Context cont=new Context(new CommonAccount());
sum=cont.doAccount(amount, price);
System.out.println("普通顾客,没有折扣,"+name+"数量:"+amount+"单价:"+price+"应付金额:"+sum);
//会员顾客
cont=new Context(new InsiderAccount());
sum=cont.doAccount(amount, price);
System.out.println("会员九折,"+name+"数量:"+amount+"单价:"+price+"应付金额:"+sum);
//普通顾客
cont=new Context(new CommonAccount());
sum=cont.doAccount(amount, price);
System.out.println("VIP八折,"+name+"数量:"+amount+"单价:"+price+"应付金额:"+sum);
}
}
- 设计模式的简单示例
- java动态代理设计模式简单示例
- JAVA设计模式示例-1 简单工厂
- 简单的设计模式
- 设计模式之简单工厂模式java示例
- 简单工厂模式C++代码示例---《大话设计模式》笔记
- java几种常用设计模式简单示例
- java几种常用设计模式简单示例
- java几种常用设计模式简单示例
- java几种常用设计模式简单示例
- C#控制台基础 简单工厂设计模式示例
- java几种常用设计模式简单示例
- java几种常用设计模式简单示例
- java几种常用设计模式简单示例
- java几种常用设计模式简单示例
- java几种常用设计模式简单示例
- 抽象工厂模式的简单代码示例
- Android中Mvp模式的简单示例
- 服务端入门《七》(Core Dump )
- [log4j2] 使用教程详解(怎么使用log4j2)
- SpringMVC Controller注解
- 写给支持和反对《完全用Linux工作》的人们
- Scala学习笔记(三)----类的写法
- 设计模式的简单示例
- 《剑指offer》:[56]五岔路口交通管理红绿灯设计
- SpriteKit给游戏弹跳角色添加一个高度标示器
- Log4j2架构及概念简介
- UNIX套接字编程
- Lua脚本中释放binary文件
- "策略模式"-之Java,Android面试必问设计模式(7/9)
- AFNetworking下载进度条显示
- Java编译原理(有感)