概述
创建型模式的核心就是通过将创建对象和使用对象分离开来,去关注于怎样去创建一个对象。
单列模式 思维导图
UML 图
懒汉式单列实现代码 1 2 3 4 5 6 7 8 9 10 11 12 13 class LazyXorex { private static volatile LazyXorex instance=null ; private LazyXorex () { } public static synchronized LazyXorex getInstance () { if (instance==null ) { instance=new LazyXorex(); } return instance; } }
饿汉式单列实现代码 1 2 3 4 5 6 7 8 9 10 class HungryXorex { private static HungryXorex instance=new HungryXorex(); private HungryXorex () { } public static HungryXorex getInstance () { return instance; } }
原型模式 思维导图
UML 图
实现可克隆类 1 2 3 4 5 6 7 8 class Tempest implements Cloneable { public String Xorex="Xorex" ; @Override protected Tempest clone () throws CloneNotSupportedException { return (Tempest)super .clone(); } }
简单工厂 思维导图
UML 图
实现内部封装的简单工厂
下面代码例子是使用简单工厂的方式获取不同的 Waifu 产品。步骤是通过相同的工厂 Factory 的静态方法 makeWaifu 来获取产品,waifu 产品的具体创建交给工厂的 makeWaifu 来决定。至于返回的是哪一个具体的 Waifu,我们并不需要关心,只需要用统一接口 Waifu 来接收并操作即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 public class Test { public static void main (String[] args) { SimpleWaifuFactory.Waifu Yukino=SimpleWaifuFactory.Factory.makeWaifu(SimpleWaifuFactory.Yukinoshita_Yukino); SimpleWaifuFactory.Waifu Asuna=SimpleWaifuFactory.Factory.makeWaifu(SimpleWaifuFactory.Yuuki_Asuna); Yukino.selfIntroduction(); Asuna.selfIntroduction(); } } public class SimpleWaifuFactory { public static final int Yukinoshita_Yukino = 0 ; public static final int Yuuki_Asuna = 1 ; public interface Waifu { void selfIntroduction () ; } private static class Yukino implements Waifu { public void selfIntroduction () { System.out.println("Ya~hello,There is Yukinoshita Yukino!" ); } } static class Asuna implements Waifu { public void selfIntroduction () { System.out.println("Hi,I am Yuuki Asnua!" ); } } static class Factory { public static Waifu makeWaifu (int waifuID) { switch (waifuID) { case Yukinoshita_Yukino: return new Yukino(); case Yuuki_Asuna: return new Asuna(); } return null ; } } }
实现外部散开工厂 这里代码需要注意,所有的工厂相关类都需要写在一个包里面,保证非 public 类型(不对外开放的)产品类只能被包内的工厂访问。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 public class SimpleFactory { public static void main (String[] args) { Waifu Yukino=SimpleWaifuFactory.makeWaifu(SimpleWaifuFactory.Yukinoshita_Yukino); Waifu Asuna=SimpleWaifuFactory.makeWaifu(SimpleWaifuFactory.Yuuki_Asuna); Yukino.selfIntroduction(); Asuna.selfIntroduction(); } } public class SimpleWaifuFactory { public static final int Yukinoshita_Yukino = 0 ; public static final int Yuuki_Asuna = 1 ; public static Waifu makeWaifu (int waifuID) { switch (waifuID) { case Yukinoshita_Yukino: return new Yukino(); case Yuuki_Asuna: return new Asuna(); } return null ; } } public interface Waifu { void selfIntroduction () ; } class Yukino implements Waifu { public void selfIntroduction () { System.out.println("Ya~hello,There is Yukinoshita Yukino!" ); } } class Asuna implements Waifu { public void selfIntroduction () { System.out.println("Hi,I am Yuuki Asnua!" ); } }
工厂方法模式 思维导图
UML 图
代码实现
主要是从简单工厂模式的一个工厂对应不同产品到工厂模式的不同工厂对应不同产品,来实现开闭原则。一旦有产品增加,可以通过增加工厂的方式来实现需求,不需要像简单工厂那样去修改原有的工厂代码。但简单工厂的代码修改可以限制在增加生产方法上面,其实也很好维护。
下面的代码通过不同的电视工厂来获取不同的电视产品,比如通过小米电视工厂获取小米电视,华为电视工厂获取华为电视,比简单工厂模式多了一个工厂接口,因此可以建立不同的工厂满足种类繁多的产品的创建,一类工厂满足一类产品。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 public class Consumer { public static void main (String[] args) { TVFactroy MiF=new MiTVFactory(); TV MiTv=MiF.getTV(); MiTv.Show(); TVFactroy HuaweiF=new HuaweiTVFactory(); TV HuaweiTv=HuaweiF.getTV(); HuaweiTv.Show(); } } interface TVFactroy { TV getTV () ; } class MiTVFactory implements TVFactroy { @Override public TV getTV () { return new MiTV4s70(); } } class HuaweiTVFactory implements TVFactroy { @Override public TV getTV () { return new HuaweiTV65(); } } interface TV { void Show () ; } class MiTV4s70 implements TV { @Override public void Show () { System.out.println("I am MiTV4s70" ); } } class HuaweiTV65 implements TV { @Override public void Show () { System.out.println("I am HuaweiTV65" ); } }
抽象工厂模式 思维导图
UML 图
代码实现
下面的代码通过建立小米族产品超级工厂和华为族产品超级工厂实现超级抽象工厂接口,这些超级工厂生产不同级产品。如通过抽象工厂接口 SuperFactory 操作小米工厂 MiFactory 的不同生产方法,如 getTV() 获取实现了抽象产品 TV 的实际产品 MiTV,用 getPhone() 获取实现了抽象产品 Phone 的实际产品 Mi11。不同工厂的同级产品,实现的抽象产品接口都是一样的。比如小米工厂生产的 Mi11 产品和华为工厂生产的 HUAWEIMate40Pro 产品同级,都是实现了抽象产品接口 Phone。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 public class Consumer { public static void main (String[] args) { System.out.println("I am a Mi-funs" ); SuperFactory Mi=new MiFactory(); Phone MiPhone=Mi.getPhone(); TV MiTV=Mi.getTV(); MiPhone.call(); MiTV.watchTV(); System.out.println(); System.out.println("I am a HUAWEI-funs" ); SuperFactory HUAWEI=new HUAWEIFactory(); Phone HUAWEIPhone=HUAWEI.getPhone(); TV HUAWEITV=HUAWEI.getTV(); HUAWEIPhone.call(); HUAWEITV.watchTV(); } } interface SuperFactory { Phone getPhone () ; TV getTV () ; } class MiFactory implements SuperFactory { @Override public Phone getPhone () { return new Mi11(); } @Override public TV getTV () { return new MiTV4s65(); } } class HUAWEIFactory implements SuperFactory { @Override public Phone getPhone () { return new HUAWEIMate40Pro(); } @Override public TV getTV () { return new HAUWEIX70(); } } interface Phone { void call () ; } interface TV { void watchTV () ; } class Mi11 implements Phone { @Override public void call () { System.out.println("I am calling by Mi11" ); } } class HUAWEIMate40Pro implements Phone { @Override public void call () { System.out.println("I am calling by HUAWEIMate40Pro" ); } } class MiTV4s65 implements TV { @Override public void watchTV () { System.out.println("I am watching MiTV4s65" ); } } class HAUWEIX70 implements TV { @Override public void watchTV () { System.out.println("I am watching HUAWEIX70!" ); } }
建造者模式 思维导图
UML 图
代码实现
下面代码通过将一个复杂产品(手机)的建造交给不同的建造者(小米建造、华为建造)得到不同的产品(小米手机,华为手机),而选择建造者的指挥建造者的是手机生产的流水线(指挥者),选择小米建造者生产小米手机,同理获得华为手机。
消费者 Foxconn:告诉指挥者(流水线)ConstructStream 需要什么手机,然后等待流水线返回手机 Phone 的实例。
指挥者 ConstructStream:根据消费者的需求(传入的手机名称),选择合适的建造者(创建对应实例 MiBuilder HUAWEIBuilder),然后指挥建造者去做自己可以完成的每一道工序(installCPU()…),完成所有步骤之后,让建造者返回手机给自己(getPhone())。
建造者 Builder:实现了建造手机的所有步骤,不同的建造者用于建造不同的手机,MiBuilder 只能完成 Mi11 的建造。
手机 Phone:单个产品,创建非常复杂,有很多初始化参数,所以交给流水线处理。
建造者关心的是如何一步一步建造 一个 比较复杂的产品(通过建造者完成大量步骤获取产品),而工厂方法关心的是以怎样的方式获取一类产品(比如通过超级工厂获取不同级产品)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 package space.xorex;public class Foxconn { public static void main (String[] args) { ConstructStream ConMiPhone=new ConstructStream("Mi11" ); Phone Mi=ConMiPhone.StartConstruct(); ConstructStream ConHUAWEIPhone=new ConstructStream("HUAWEIMate40Pro" ); Phone HUAWEI=ConHUAWEIPhone.StartConstruct(); } } class ConstructStream { private String PhoneName; private Builder worker; public ConstructStream (String phoneName) { PhoneName = phoneName; } public Phone StartConstruct () { if (PhoneName=="Mi11" ) worker=new MiBuilder(PhoneName); if (PhoneName=="HUAWEIMate40Pro" ) worker=new HUAWEIBuilder(PhoneName); worker.installCPU(); worker.installGPU(); worker.installRAM(); worker.installROM(); worker.installScreen(); worker.installBattery(); worker.installCamera(); return worker.getPhone(); } } interface Builder { void installCPU () ; void installGPU () ; void installRAM () ; void installROM () ; void installScreen () ; void installBattery () ; void installCamera () ; Phone getPhone () ; } class MiBuilder implements Builder { private Phone phone=null ; MiBuilder(String PhoneName) { phone=new Phone(PhoneName); System.out.println(PhoneName+" start making!" ); } @Override public void installCPU () { phone.installCPU("SnapDragon 888" ); System.out.println("Installed CPU : SnapDragon 888" ); } @Override public void installGPU () { phone.installGPU("Adreno 660" ); System.out.println("Install GPU : Adreno 660" ); } @Override public void installRAM () { phone.installRAM("LPDDR5" ); System.out.println("Install RAM : LPDDR5" ); } @Override public void installROM () { phone.installROM("UFS 3.1" ); System.out.println("Install ROM : UFS 3.1" ); } @Override public void installScreen () { phone.installScreen("OLED2k120HZ" ); System.out.println("Install Screen : OLED2k120HZ" ); } @Override public void installBattery () { phone.installBettary("4600mah" ); System.out.println("Install Battery : 4600mah" ); } @Override public void installCamera () { phone.installCarame("HMX" ); System.out.println("Install Camera : HMX" ); } @Override public Phone getPhone () { System.out.println("Mi11 made Successfully!" ); return phone; } } class HUAWEIBuilder implements Builder { private Phone phone=null ; HUAWEIBuilder(String PhoneName) { this .phone = new Phone(PhoneName); System.out.println(PhoneName+" start making!" ); } @Override public void installCPU () { phone.installCPU("Kirin9000" ); System.out.println("Install CPU Kirin9000" ); } @Override public void installGPU () { phone.installGPU("Mali-G78" ); System.out.println("Install GPU : Mali-G78" ); } @Override public void installRAM () { phone.installRAM("LPDDR5" ); System.out.println("Install RAM : LPDDR5" ); } @Override public void installROM () { phone.installROM("UFS3.1" ); System.out.println("Install ROM : UFS3.1" ); } @Override public void installScreen () { phone.installScreen("OLED1080P90HZ" ); System.out.println("Install Screen : OLED1080P90HZ" ); } @Override public void installBattery () { phone.installBettary("4400mah" ); System.out.println("Install Battery : 4400mah" ); } @Override public void installCamera () { phone.installCarame("IMX700" ); System.out.println("Install Camera : IMX700" ); } @Override public Phone getPhone () { System.out.println("HUAWEIMate40Pro made Successfully!" ); return phone; } } class Phone { private String Name=null ; private String CPU=null ; private String GPU=null ; private String RAM=null ; private String ROM=null ; private String Screen=null ; private String Bettary=null ; private String Carame=null ; public Phone (String name) { Name = name; } public void installCPU (String CPU) { this .CPU = CPU; } public void installGPU (String GPU) { this .GPU = GPU; } public void installRAM (String RAM) { this .RAM = RAM; } public void installROM (String ROM) { this .ROM = ROM; } public void installScreen (String screen) { Screen = screen; } public void installBettary (String bettary) { Bettary = bettary; } public void installCarame (String carame) { Carame = carame; } }