
创建型模式
1、创建型模式的关注点是“怎/样创建出对象”
2、“将对象的创建与使用分离”
3、降低系统耦合度
4、使用者无需关注对象的创建细节
1)对象的创建由相关的工厂完成 (各种工厂模式)
2)对象的创建由一个建造者来完成(建造者模式)
3)对象的创建由原来对象克隆完成(原型模式)
4)对象是在在系统中只有一个实力(单例模式)
单例模式
一个单一的类,负责创建自己的对象,同时确保系统中只有单个对象被创建。
单例特点:
1、某个类只能有一个实例(构造器私有)
2、它必须自行创建这个实例(自己编写实例化逻辑)
3、它必须自行向整个系统提供这个实例(对外提供实例化方法)
懒汉模式
package com.example.designPatterns.singleton;
/**
* 易烊千玺老师只有一个
*/
public class Person {
private String name;
private String age;
/**
* 懒汉:用的时候才去创建
*/
private static Person instance;
//构造器私有,别人用不了(外部不能实例化)
private Person(){
System.out.println("创建了Person=============");
}
//单例提供给外部的方法
public static Person guiguBoss(){
//如果没有再去创建,懒汉模式
if(instance==null){
Person person=new Person();
instance=person;
}
return instance;
}
}
package com.example.designPatterns.singleton;
public class MainTest {
public static void main(String[] args) {
Person person1=Person.guiguBoss();
Person person2=Person.guiguBoss();
System.out.println(person1==person2);
}
}
输出结果:
创建了Person=============
true
//加锁方法一:在方法上加锁
package com.example.designPatterns.singleton;
/**
* 易烊千玺老师只有一个
*/
public class Person {
private String name;
private String age;
/**
* 懒汉:用的时候才去创建
*/
private static Person instance;
//构造器私有,别人用不了(外部不能实例化)
private Person(){
System.out.println("创建了Person=============");
}
//单例提供给外部的方法
//1、如果多线程需要加锁 synchronized 锁太大倒置效率太低
public static synchronized Person guiguBoss(){
//如果没有再去创建,懒汉模式
if(instance==null){
Person person=new Person();
instance=person;
}
return instance;
}
}
//加锁方法二:进入方法里面再加锁
package com.example.designPatterns.singleton;
/**
* 易烊千玺老师只有一个
*/
public class Person {
private String name;
private String age;
/**
* 懒汉:用的时候才去创建
*/
private static Person instance;
//构造器私有,别人用不了(外部不能实例化)
private Person(){
System.out.println("创建了Person=============");
}
//单例提供给外部的方法
//2、如果多线程需要加锁 两个线程同时请求时,进到方法里面再加锁,效率还是很低
public static Person guiguBoss(){
synchronized(Person.class) {
//如果没有再去创建,懒汉模式
if (instance == null) {
Person person = new Person();
instance = person;
}
}
return instance;
}
}
/**
如果在空判断下面加锁,如果两个线程进来都判断为空,都去执行下面的步骤,还是会有问题,和没加锁一样还是会存在多线程并发的问题
*/
package com.example.designPatterns.singleton;
/**
* 易烊千玺老师只有一个
*/
public class Person {
private String name;
private String age;
/**
* 懒汉:用的时候才去创建
*/
private static Person instance;
//构造器私有,别人用不了(外部不能实例化)
private Person(){
System.out.println("创建了Person=============");
}
//单例提供给外部的方法
//2、如果多线程需要加锁 两个线程同时请求时,进到方法里面再加锁,效率还是很低
public static Person guiguBoss(){
//如果没有再去创建,懒汉模式
if (instance == null) {
synchronized(Person.class) {
Person person = new Person();
instance = person;
}
}
return instance;
}
}
//加锁,方法三:双重检查空判断+内存可见性
package com.example.designPatterns.singleton;
/**
* 易烊千玺老师只有一个
*/
public class Person {
private String name;
private String age;
/**
* 懒汉:用的时候才去创建
*/
private volatile static Person instance;
//构造器私有,别人用不了(外部不能实例化)
private Person(){
System.out.println("创建了Person=============");
}
//单例提供给外部的方法
//3、如果多线程需要加锁 两个线程同时请求时,进到方法里面再加锁,锁后面再做空判断,效率会提升很多
public static Person guiguBoss(){
//如果没有再去创建,懒汉模式
if (instance == null) {
synchronized(Person.class) {
if(instance == null) {
Person person = new Person();
instance = person;
}
}
}
return instance;
}
}
package com.example.designPatterns.singleton;
import java.util.Map;
import java.util.Properties;
public class MainTest {
public static void main(String[] args) {
//系统中方法使用单例的例子
System.out.println("================以下是系统信息=================");
Properties properties=System.getProperties();
System.out.println(properties);
System.out.println("=================以下是环境变量信息================");
Map<String ,String> getenv=System.getenv();
System.out.println(getenv);
}
}
输出:
Connected to the target VM, address: '127.0.0.1:50214', transport: 'socket'
================以下是系统信息=================
{java.runtime.name=OpenJDK Runtime Environment, sun.boot.library.path=/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib, java.vm.version=25.312-b07, gopherProxySet=false, java.vm.vendor=BellSoft, java.vendor.url=https://bell-sw.com/, path.separator=:, java.vm.name=OpenJDK 64-Bit Server VM, file.encoding.pkg=sun.io, user.country=CN, sun.java.launcher=SUN_STANDARD, sun.os.patch.level=unknown, java.vm.specification.name=Java Virtual Machine Specification, user.dir=/Users/zhangyue/IdeaProjects/springboot, intellij.debug.agent=true, java.runtime.version=1.8.0_312-b07, java.awt.graphicsenv=sun.awt.CGraphicsEnvironment, java.endorsed.dirs=/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/endorsed, os.arch=x86_64, java.io.tmpdir=/var/folders/2b/vbxntjh52wx3s8yz0_d5_zr40000gn/T/, line.separator=
, java.vm.specification.vendor=Oracle Corporation, os.name=Mac OS X, sun.jnu.encoding=UTF-8, java.library.path=/Users/zhangyue/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:., jboss.modules.system.pkgs=com.intellij.rt, java.specification.name=Java Platform API Specification, java.class.version=52.0, sun.management.compiler=HotSpot 64-Bit Tiered Compilers, os.version=10.14.6, http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16, user.home=/Users/zhangyue, user.timezone=, java.awt.printerjob=sun.lwawt.macosx.CPrinterJob, file.encoding=UTF-8, java.specification.version=1.8, java.class.path=/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/charsets.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/ext/cldrdata.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/ext/dnsns.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/ext/jaccess.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/ext/jfxrt.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/ext/localedata.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/ext/nashorn.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/ext/sunec.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/ext/sunjce_provider.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/ext/sunpkcs11.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/ext/zipfs.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/jce.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/jfr.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/jfxswt.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/jsse.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/management-agent.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/resources.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/rt.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/lib/ant-javafx.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/lib/dt.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/lib/javafx-mx.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/lib/jconsole.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/lib/packager.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/lib/sa-jdi.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/lib/tools.jar:/Users/zhangyue/IdeaProjects/springboot/target/classes:/Users/zhangyue/.m2/repository/org/springframework/boot/spring-boot-starter-web/2.6.0/spring-boot-starter-web-2.6.0.jar:/Users/zhangyue/.m2/repository/org/springframework/boot/spring-boot-starter/2.6.0/spring-boot-starter-2.6.0.jar:/Users/zhangyue/.m2/repository/org/springframework/boot/spring-boot-starter-logging/2.6.0/spring-boot-starter-logging-2.6.0.jar:/Users/zhangyue/.m2/repository/ch/qos/logback/logback-classic/1.2.7/logback-classic-1.2.7.jar:/Users/zhangyue/.m2/repository/ch/qos/logback/logback-core/1.2.7/logback-core-1.2.7.jar:/Users/zhangyue/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.14.1/log4j-to-slf4j-2.14.1.jar:/Users/zhangyue/.m2/repository/org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1.jar:/Users/zhangyue/.m2/repository/org/slf4j/jul-to-slf4j/1.7.32/jul-to-slf4j-1.7.32.jar:/Users/zhangyue/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/Users/zhangyue/.m2/repository/org/yaml/snakeyaml/1.29/snakeyaml-1.29.jar:/Users/zhangyue/.m2/repository/org/springframework/boot/spring-boot-starter-json/2.6.0/spring-boot-starter-json-2.6.0.jar:/Users/zhangyue/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.13.0/jackson-databind-2.13.0.jar:/Users/zhangyue/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.13.0/jackson-annotations-2.13.0.jar:/Users/zhangyue/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.13.0/jackson-core-2.13.0.jar:/Users/zhangyue/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.13.0/jackson-datatype-jdk8-2.13.0.jar:/Users/zhangyue/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.13.0/jackson-datatype-jsr310-2.13.0.jar:/Users/zhangyue/.m2/repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.13.0/jackson-module-parameter-names-2.13.0.jar:/Users/zhangyue/.m2/repository/org/springframework/boot/spring-boot-starter-tomcat/2.6.0/spring-boot-starter-tomcat-2.6.0.jar:/Users/zhangyue/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/9.0.55/tomcat-embed-core-9.0.55.jar:/Users/zhangyue/.m2/repository/org/apache/tomcat/embed/tomcat-embed-el/9.0.55/tomcat-embed-el-9.0.55.jar:/Users/zhangyue/.m2/repository/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.55/tomcat-embed-websocket-9.0.55.jar:/Users/zhangyue/.m2/repository/org/springframework/spring-web/5.3.13/spring-web-5.3.13.jar:/Users/zhangyue/.m2/repository/org/springframework/spring-beans/5.3.13/spring-beans-5.3.13.jar:/Users/zhangyue/.m2/repository/org/springframework/spring-webmvc/5.3.13/spring-webmvc-5.3.13.jar:/Users/zhangyue/.m2/repository/org/springframework/spring-aop/5.3.13/spring-aop-5.3.13.jar:/Users/zhangyue/.m2/repository/org/springframework/spring-context/5.3.13/spring-context-5.3.13.jar:/Users/zhangyue/.m2/repository/org/springframework/spring-expression/5.3.13/spring-expression-5.3.13.jar:/Users/zhangyue/.m2/repository/org/springframework/boot/spring-boot-devtools/2.6.0/spring-boot-devtools-2.6.0.jar:/Users/zhangyue/.m2/repository/org/springframework/boot/spring-boot/2.6.0/spring-boot-2.6.0.jar:/Users/zhangyue/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.6.0/spring-boot-autoconfigure-2.6.0.jar:/Users/zhangyue/.m2/repository/org/projectlombok/lombok/1.18.22/lombok-1.18.22.jar:/Users/zhangyue/.m2/repository/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar:/Users/zhangyue/.m2/repository/org/springframework/spring-core/5.3.13/spring-core-5.3.13.jar:/Users/zhangyue/.m2/repository/org/springframework/spring-jcl/5.3.13/spring-jcl-5.3.13.jar:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar:/Users/zhangyue/Library/Caches/JetBrains/IntelliJIdea2021.2/captureAgent/debugger-agent.jar, user.name=zhangyue, java.vm.specification.version=1.8, sun.java.command=com.example.designPatterns.singleton.MainTest, java.home=/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre, sun.arch.data.model=64, user.language=zh, java.specification.vendor=Oracle Corporation, awt.toolkit=sun.lwawt.macosx.LWCToolkit, java.vm.info=mixed mode, java.version=1.8.0_312, java.ext.dirs=/Users/zhangyue/Library/Java/Extensions:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/ext:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java, sun.boot.class.path=/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/resources.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/rt.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/sunrsasign.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/jsse.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/jce.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/charsets.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/lib/jfr.jar:/Users/zhangyue/Library/Java/JavaVirtualMachines/liberica-1.8.0_312/jre/classes, java.vendor=BellSoft, file.separator=/, java.vendor.url.bug=https://bell-sw.com/support, sun.io.unicode.encoding=UnicodeBig, sun.cpu.endian=little, socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16, ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16, sun.cpu.isalist=}
=================以下是环境变量信息================
{PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin, SHELL=/bin/bash, USER=zhangyue, TMPDIR=/var/folders/2b/vbxntjh52wx3s8yz0_d5_zr40000gn/T/, SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.YUyHFTVJHh/Listeners, XPC_FLAGS=0x0, __CF_USER_TEXT_ENCODING=0x1F5:0x19:0x34, Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.VaXKjZJRZX/Render, LOGNAME=zhangyue, LC_CTYPE=zh_CN.UTF-8, PWD=/Users/zhangyue/IdeaProjects/springboot, XPC_SERVICE_NAME=com.jetbrains.intellij.3032, JAVA_MAIN_CLASS_898=com.example.designPatterns.singleton.MainTest, HOME=/Users/zhangyue}
Disconnected from the target VM, address: '127.0.0.1:50214', transport: 'socket'
Process finished with exit code 0
原型模式
原型模式是用于创建重复的对象,同时又能保证性能。
【本体给外部提供一个克隆体进行使用】
package com.example.designPatterns.prototype;
/**
* 是用于创建重复的对象,同时又能保证性能
* 1、GuiguMybatis:操作数据库,从数据库里面查出很多记录(70%很少改变)
* 3、每次查数据库,查到以后把所有数据都封装一个对象,返回。
* 10000 thread :查一个记录:new User("yiyangqianxi",18);每次创建一个对象封装并返回
* 系统里面就会有10000个User;浪费内存
* 3、解决:缓存;查过的保存。
* 如果再查相同的记录,拿到原来的原型对象。
*/
public class MainTest {
public static void main(String[] args) {
GuiguMybatis guiguMybatis = new GuiguMybatis();
User user1 = guiguMybatis.getUser("易烊千玺");
User user2 = guiguMybatis.getUser("易烊千玺");
User user3 = guiguMybatis.getUser("易烊千玺");
}
}
package com.example.designPatterns.prototype;
import lombok.Data;
@Data
public class User {
private String username;
private Integer age;
public User(){
System.out.println("User对象创建");
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
'}';
}
}
package com.example.designPatterns.prototype;
public class GuiguMybatis {
public User getUser(String username){
//模拟从数据库查询
User user = getUserFromDB(username);
return user;
}
private User getUserFromDB(String username) {
System.out.println("从数据库查询:"+username+",并且创建对象");
User user = new User();
user.setUsername(username);
user.setAge(18);
return user;
}
}
输出:
Connected to the target VM, address: '127.0.0.1:50568', transport: 'socket'
从数据库查询:易烊千玺,并且创建对象
User对象创建
从数据库查询:易烊千玺,并且创建对象
User对象创建
从数据库查询:易烊千玺,并且创建对象
User对象创建
Disconnected from the target VM, address: '127.0.0.1:50568', transport: 'socket'
Process finished with exit code 0
以上:每使用一次,都创建一次对象,去数据库查询一次
需要提高效率,以改进
package com.example.designPatterns.prototype;
/**
* 是用于创建重复的对象,同时又能保证性能
* 1、GuiguMybatis:操作数据库,从数据库里面查出很多记录(70%很少改变)
* 3、每次查数据库,查到以后把所有数据都封装一个对象,返回。
* 10000 thread :查一个记录:new User("yiyangqianxi",18);每次创建一个对象封装并返回
* 系统里面就会有10000个User;浪费内存
* 3、解决:缓存;查过的保存。
* 如果再查相同的记录,拿到原来的原型对象。
* 4、此时直接拿到缓存中的对象
*/
public class MainTest {
public static void main(String[] args) throws CloneNotSupportedException {
GuiguMybatis guiguMybatis = new GuiguMybatis();
//得到的是克隆体
User user1 = guiguMybatis.getUser("易烊千玺");
System.out.println("1--->"+user1);
user1.setUsername("王俊凯");
System.out.println("2--->"+user1);
//得到的是克隆体
User user2 = guiguMybatis.getUser("易烊千玺");
System.out.println("3--->"+user2);
//得到的是克隆体
User user3 = guiguMybatis.getUser("易烊千玺");
System.out.println("4--->"+user3);
System.out.println();
}
}
package com.example.designPatterns.prototype;
import lombok.Data;
/**
* implements Cloneable代表当前对象可克隆
*/
@Data
public class User implements Cloneable{
private String username;
private Integer age;
public User(){
System.out.println("User对象创建");
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
'}';
}
/**
* 再创建一个人,赋予所有属性
* @return
* @throws CloneNotSupportedException
*/
protected Object clone() throws CloneNotSupportedException{
User user=new User();
user.setUsername(this.username);
user.setAge(this.age);
return super.clone();
}
}
package com.example.designPatterns.prototype;
import java.util.HashMap;
import java.util.Map;
public class GuiguMybatis {
//缓存User
private Map<String,User> userCaChe=new HashMap<>();
public User getUser(String username) throws CloneNotSupportedException {
User user=null;
//缓存中没有
if(!userCaChe.containsKey(username)) {
//模拟从数据库查询
user = getUserFromDB(username);
}else {
//原型已经拿到,但是不能直接给,直接给就可能引起脏缓存(本人)
user =userCaChe.get(username);
System.out.println("从缓存中拿到=========="+username);
//从这个对象中快速得到一个克隆体(克隆人)==原型模式(在实体类实现一个implements Cloneable)
user = (User) user.clone();
}
return user;
}
private User getUserFromDB(String username) throws CloneNotSupportedException {
System.out.println("从数据库查询:"+username+",并且创建对象");
User user = new User();
user.setUsername(username);
user.setAge(18);
userCaChe.put(username, (User) user.clone());
return user;
}
}
输出:
Connected to the target VM, address: '127.0.0.1:50687', transport: 'socket'
从数据库查询:易烊千玺,并且创建对象
User对象创建
User对象创建
1--->User{username='易烊千玺', age=18}
2--->User{username='王俊凯', age=18}
从缓存中拿到==========易烊千玺
User对象创建
3--->User{username='易烊千玺', age=18}
从缓存中拿到==========易烊千玺
User对象创建
4--->User{username='易烊千玺', age=18}
Disconnected from the target VM, address: '127.0.0.1:50687', transport: 'socket'
Process finished with exit code 0
工厂模式
工厂模式提供了一种创建对象的最佳方式,我们不必关系对象的创建细节,只需要根据不同情况获取不同的产品即可

简单工厂

简单工厂带来的问题:更多的产品就会违反开闭原则
package com.example.designPatterns.factory.simple;
/**
* 工厂的产品
*/
public abstract class AbstractCar {
String engine;
public abstract void run();
}
package com.example.designPatterns.factory.simple;
/**
* 简单工厂
* 1、产品数量极少
*/
public class WulingSimpleFactory {
public AbstractCar newCar(String type){
if("van".equals(type)){
return new Vancar();
}else if("mini".equals(type)){
return new MiniCar();
}
return null;
}
}
package com.example.designPatterns.factory.simple;
public class MiniCar extends AbstractCar{
public MiniCar(){
this.engine ="四缸水平对置发动机";
}
@Override
public void run() {
System.out.println(engine+"dududu~~");
}
}
package com.example.designPatterns.factory.simple;
/**
* 具体产品
*/
public class Vancar extends AbstractCar{
public Vancar(){
this.engine="单杠柴油机";
}
@Override
public void run() {
System.out.println(engine+"dadada~~~");
}
}
package com.example.designPatterns.factory.simple;
public class MainTest {
public static void main(String[] args) {
WulingSimpleFactory wulingSimpleFactory=new WulingSimpleFactory();
AbstractCar van = wulingSimpleFactory.newCar("van");
van.run();
AbstractCar mini = wulingSimpleFactory.newCar("mini");
mini.run();
AbstractCar okk = wulingSimpleFactory.newCar("okk");
System.out.println(okk);
}
}
输出:
Connected to the target VM, address: '127.0.0.1:50832', transport: 'socket'
单杠柴油机dadada~~~
四缸水平对置发动机dududu~~
null
Disconnected from the target VM, address: '127.0.0.1:50832', transport: 'socket'
Process finished with exit code 0
工厂方法模式

/**
*四个角色
*1、抽象产品
*2、具体产品
*3、抽象工厂
*4、具体工厂
*/
package com.example.designPatterns.factory.factorymethod;
/**
* 工厂的产品
* 怎么把一个功能提升一个层次,定义抽象(抽象类,接口)
* 抽象类,接口 就会有多实现,多实现自然就有多功能
*/
public abstract class AbstractCar {
String engine;
public abstract void run();
}
package com.example.designPatterns.factory.factorymethod;
/**
* 抽象工厂的层级
*/
public abstract class AbstractCarFactory {
public abstract AbstractCar newCar();
}
package com.example.designPatterns.factory.factorymethod;
public class MiniCar extends AbstractCar {
public MiniCar(){
this.engine ="四缸水平对置发动机";
}
@Override
public void run() {
System.out.println(engine+"dududu~~");
}
}
package com.example.designPatterns.factory.factorymethod;
public class RacingCar extends AbstractCar{
public RacingCar(){
this.engine="V8发动机";
}
@Override
public void run() {
System.out.println(engine+"嗖嗖~~");
}
}
package com.example.designPatterns.factory.factorymethod;
/**
* 具体产品
*/
public class Vancar extends AbstractCar {
public Vancar(){
this.engine="单杠柴油机";
}
@Override
public void run() {
System.out.println(engine+"dadada~~~");
}
}
package com.example.designPatterns.factory.factorymethod;
/**
*
*/
public class WulingMiniCarFactory extends AbstractCarFactory{
@Override
public AbstractCar newCar() {
return new MiniCar();
}
}
package com.example.designPatterns.factory.factorymethod;
/**
*
*/
public class WulingRacingCarFactory extends AbstractCarFactory{
@Override
public AbstractCar newCar() {
return new RacingCar();
}
}
package com.example.designPatterns.factory.factorymethod;
public class WulingVanCarFactory extends AbstractCarFactory{
@Override
public AbstractCar newCar() {
return new Vancar();
}
}
package com.example.designPatterns.factory.factorymethod;
public class MainTest {
public static void main(String[] args) {
AbstractCarFactory abstractCarFactory=new WulingRacingCarFactory();
AbstractCar abstractCar = abstractCarFactory.newCar();
abstractCar.run();
System.out.println("==================");
abstractCarFactory=new WulingMiniCarFactory();
AbstractCar abstractCar1 = abstractCarFactory.newCar();
abstractCar1.run();
}
}
抽象工厂
产品等级结构:产品等级结构即产品继承结构,如抽象类是手机,其子类有小米手机,华为手机
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的位于不同产品等级结构中的一组产品

package com.example.designPatterns.factory.abstractfactory;
import java.util.List;
/**
* 五菱总厂
*/
public abstract class WulingFactory {
List<String> rules;
abstract AbstractCar newCar();
abstract AbstractMask newMask();
}
package com.example.designPatterns.factory.abstractfactory;
/**
* 工厂的产品
* 怎么把一个功能提升一个层次,定义抽象(抽象类,接口)
* 抽象类,接口 就会有多实现,多实现自然就有多功能
*/
public abstract class AbstractCar {
String engine;
public abstract void run();
}
package com.example.designPatterns.factory.abstractfactory;
/**
* 抽象产品
*/
public abstract class AbstractMask {
Integer price;
public abstract void protectedMe();
}
package com.example.designPatterns.factory.abstractfactory;
/**
* wuling汽车集团
*/
public abstract class WulingCarFactory extends WulingFactory{
@Override
abstract AbstractCar newCar();
@Override
AbstractMask newMask() {
return null;
}
}
package com.example.designPatterns.factory.abstractfactory;
/**
* 五菱口罩集团
*/
public abstract class WulingMaskFactory extends WulingFactory{
@Override
AbstractCar newCar() {
return null;
}
@Override
abstract AbstractMask newMask();
}
package com.example.designPatterns.factory.abstractfactory;
/**
* 分厂,只造MiniCar
*/
public class WulingMiniCarFactory extends WulingCarFactory{
@Override
AbstractCar newCar() {
return new MiniCar();
}
}
package com.example.designPatterns.factory.abstractfactory;
/**
* 分厂,只造RacingCar
*/
public class WulingRacingCarFactory extends WulingCarFactory{
@Override
AbstractCar newCar() {
return new RacingCar();
}
}
package com.example.designPatterns.factory.abstractfactory;
/**
* 只造口罩
*/
public class WulingHangZhouMaskFactory extends WulingMaskFactory{
@Override
AbstractMask newMask() {
return new CommonMask();
}
}
package com.example.designPatterns.factory.abstractfactory;
/**
* 只造口罩
*/
public class WulingWuHanMaskFactory extends WulingMaskFactory{
@Override
AbstractMask newMask() {
return new N95mask();
}
}
package com.example.designPatterns.factory.abstractfactory;
public class RacingCar extends AbstractCar {
public RacingCar(){
this.engine="V8发动机";
}
@Override
public void run() {
System.out.println(engine+"嗖嗖~~");
}
}
package com.example.designPatterns.factory.abstractfactory;
public class MiniCar extends AbstractCar {
public MiniCar(){
this.engine ="四缸水平对置发动机";
}
@Override
public void run() {
System.out.println(engine+"dududu~~");
}
}
package com.example.designPatterns.factory.abstractfactory;
public class CommonMask extends AbstractMask{
public CommonMask(){
this.price=1;
}
@Override
public void protectedMe() {
System.out.println("普通口罩简单保护,请及时更换~~~");
}
}
package com.example.designPatterns.factory.abstractfactory;
/**
* 具体产品
*/
public class N95mask extends AbstractMask{
public N95mask(){
this.price=5;
}
@Override
public void protectedMe() {
System.out.println("N95口罩超级防护");
}
}
package com.example.designPatterns.factory.abstractfactory;
/**
* 抽象工厂为了满足更多产品线
* 虽然写起来有很多类,但是用起来很清晰简单
*/
public class MainTest {
public static void main(String[] args) {
WulingFactory wulingFactory=new WulingWuHanMaskFactory();
AbstractCar abstractCar = wulingFactory.newCar();
AbstractMask abstractMask = wulingFactory.newMask();
abstractMask.protectedMe();
wulingFactory=new WulingHangZhouMaskFactory();
AbstractMask abstractMask1 = wulingFactory.newMask();
abstractMask1.protectedMe();
}
}
输出:
N95口罩超级防护
普通口罩简单保护,请及时更换~~~
Disconnected from the target VM, address: '127.0.0.1:51165', transport: 'socket'
Process finished with exit code 0