java23种设计模式
来源:互联网 发布:淘宝抱枕推荐 编辑:程序博客网 时间:2024/06/07 06:19
1普通工厂模式
public interface Book {
public void bookKind();
}
public class EnglishBook implements Book{
public void bookKind() {
System.out.println("英语书");
}
}
public class MathBook implements Book{
public void bookKind() {
System.out.println("数学书");
}
}
public class BookFactory {
public Book produce(String bookName){
if("english".equals(bookName)){
return new EnglishBook();
}else if("math".equals(bookName)){
return new MathBook();
}else{
System.out.println("输入的书名错误");
return null;
}
}
}
public class Test {
public static void main(String[] args) {
BookFactory bookFactory = new BookFactory();
Book produce = bookFactory.produce("english");
produce.bookKind();
}
}
测试结果:英语书
此时如果输入字符串有误,则创建不了实例
2多个工厂模式
public class BookFactory1 {
public Book produceEnglish() {
return new EnglishBook();
}
public Book produceMath() {
return new MathBook();
}
}
public class Test {
public static void main(String[] args) {
BookFactory1 bookFactory = new BookFactory1();
Book produce = bookFactory.produceEnglish();
produce.bookKind();
}
}
还可以优化,
3静态工厂模式
public class BookFactory1 {
public static Book produceEnglish() {
return new EnglishBook();
}
public static Book produceMath() {
return new MathBook();
}
}
public class Test1 {
public static void main(String[] args) {
Book produceEnglish = BookFactory1.produceEnglish();
produceEnglish.bookKind();
}
}
此方法创建实例很方便,但是又有问题来了,如果要增加生产的实例,就要修改代码,就违背了闭包原则
4抽象工厂模式
增加一个接口
public interface Provider {
public Book produce();
}
每一个要创建的实力新建一个工厂类并且都要事先Provider接口
public class BookEnglishFactory implements Provider{
public Book produce() {
return new EnglishBook();
}
}
public class BookMathFactory implements Provider{
public Book produce() {
return new MathBook();
}
}
测试:
public class Test {
public static void main(String[] args) {
Provider provider=new StudentFactory();
Book produce = provider.produce();
produce.bookKind();
}
}
如果要增加的话,只需要新建这个类并实现Book,再创建这个类的工厂类实现Provider接口就行
5单例模式
第一种:
public class Singleton {
//持有私有静态实例,此处赋值为null,目的是实现延迟加载
private static Singleton instance=null;
//私有构造方法,防止被实例化
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
synchronized (instance) {
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
public Object readResolve(){
return instance;
}
}
第二种:
public class Singleton1 {
/**
* 私有构造方法,防止被实例化
*/
private Singleton1(){
}
/**
* 此处使用一个内部类来维护单例
* @author 严
*
*/
private static class SingletonFactory{
private static Singleton1 instance=new Singleton1();
}
/**
* 获取实例
* @return
*/
public static Singleton1 getInstance(){
return SingletonFactory.instance;
}
/**
* 如果该对象用于序列化,可以保证对象在序列化前后保持一致
*/
public Object readResolve(){
return getInstance();
}
}
第二种设计模式优势在于,jvm内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的,这样就保证了Instance只被创建一次,算是挺完美的,
6建造者模式
public class Prototype implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Prototype proto = (Prototype) super.clone();
return proto;
}
}
6.1深复制和浅复制
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的
这个建造者模式我还没弄懂
7适配器模式
public class Source {
public void method1(){
System.out.println("this is source");
}
}
public interface Targetable {
public void method1();
public void method2();
}
public class Adapter extends Source implements Targetable{
public void method2() {
System.out.println("this is the targetavb;e");
}
}
public class Test {
public static void main(String[] args) {
Targetable target=new Adapter();
target.method1();
target.method2();
}
}
8代理模式
public interface Sourceable {
public void method();
}
public class Source implements Sourceable {
public void method() {
System.out.println("the source");
}
}
public class Proxy implements Sourceable{
private Source source;
public Proxy(){
super();
this.source=new Source();
}
public void method() {
before();
source.method();
after();
}
private void before(){
System.out.println("before");
}
private void after(){
System.out.println("after");
}
}
public class Test {
public static void main(String[] args) {
Sourceable source=new Proxy();
source.method();
}
}
2017年6月19号,学习了java23中设计模式,做的学习记录
- Java23种设计模式
- JAVA23种设计模式
- JAVA23种设计模式
- JAVA23种设计模式
- JAVA23种设计模式
- JAVA23种设计模式
- JAVA23种设计模式
- java23种设计模式
- Java23种设计模式
- java23种设计模式
- java23种设计模式
- java23种设计模式
- java23种设计模式
- java23种设计模式
- Java23种设计模式
- java23种设计模式
- java23种设计模式
- java23种设计模式
- EasyUI学习总结(五)——EasyUI组件使用
- TimePicker使用小技巧
- 直接插入排序
- 教你,怎样通过饮食减轻皱纹
- linux常用命令
- java23种设计模式
- 第16章 性能优化
- EasyUI学习总结(六)——EasyUI布局
- IntelliJ IDEA Tomcat配置 详解
- 前端、后台、终端交互之编码格式
- 协同过滤算法
- javascript 5种基础数据类型
- C# GDI winfrom 图像转换椭圆形
- 利用HttpClient发送基于Content-Type="multipart/form-data"形式的表单