前言:
创建型设计模式:
-
简单工厂模式(Simple Factory)
-
工厂方法模式(Factory Method)
-
抽象工厂模式(Abstract Factory)
-
建造者模式(Builder)
-
原型模式(Prototype)
-
单例模式(Singleton)
简单工厂模式
模式结构:
java代码:
public class testClient {
@Test
public void main() {
//根据喜好,工厂自行判断
coke coke1 = icebox.getCoke("我喜欢红色");
coke1.drink();
//客户知道自己想要什么
coke coke2 = icebox.getPepsiCoke();
coke2.drink();
}
}
-
Factory:负责实例化
public class icebox {
public static coke getCoke(String type) {
switch (type) {
case "我喜欢红色":
return new coca_cola();
case "我喜欢蓝色":
return new pepsi_cola();
default:
return new coca_cola();
}
}
public static coke getCocaCoke() {
return new coca_cola();
}
public static coke getPepsiCoke() {
return new pepsi_cola();
}
}
-
Product:产品抽象
public interface coke {
public void drink();
}
-
ConcreteProduct:具体产品
public class coca_cola implements coke{
@Override
public void drink() {
System.out.println("冰镇的可口可乐真好喝!");
}
}
public class pepsi_cola implements coke{
@Override
public void drink() {
System.out.println("冰镇的百事可乐真好喝!");
}
}
工厂方法模式
模式结构:
java代码:
public class testClient {
@Test
public void main() {
//自己家拿可乐
icebox my = new my_icebox();
coke coke1 = my.getCoke();
coke1.drink();
//商店里拿可乐
icebox shop = new shop_icebox();
coke coke2 = shop.getCoke();
coke2.drink();
}
}
-
Creator:工厂抽象
public interface icebox {
public coke getCoke();
}
-
ConcreteCreator:负责实例化
public class my_icebox implements icebox {
@Override
public coke getCoke() {
return new coca_cola();
}
}
public class shop_icebox implements icebox{
@Override
public coke getCoke() {
return new pepsi_cola();
}
}
-
Product:产品抽象
public interface coke {
public void drink();
}
-
ConcreteProduct:具体产品
public class coca_cola implements coke{
@Override
public void drink() {
System.out.println("冰镇的可口可乐真好喝!");
}
}
public class pepsi_cola implements coke{
@Override
public void drink() {
System.out.println("冰镇的百事可乐真好喝!");
}
}
抽象工厂模式
模式结构:
java代码:
public class testClient {
@Test
public void main() {
//麦当劳
restaurant m = new MacDonald();
coke m_c = m.getCoke();
hanmburger m_h = m.getHanmburger();
m_c.drink();
m_h.eat();
//肯德基
restaurant k = new KFC();
coke k_c = k.getCoke();
hanmburger k_h = k.getHanmburger();
k_c.drink();
k_h.eat();
}
}
-
Creator:工厂抽象
public interface restaurant {
public coke getCoke();
public hanmburger getHanmburger();
}
-
ConcreteCreator:负责实例化
public class MacDonald implements restaurant {
@Override
public coke getCoke() {
return new coca_cola();
}
@Override
public hanmburger getHanmburger() {
return new mac_hamburger();
}
}
public class KFC implements restaurant {
@Override
public coke getCoke() {
return new pepsi_cola();
}
@Override
public hanmburger getHanmburger() {
return new kfc_hamburger();
}
}
-
Product:产品抽象
public interface coke {
public void drink();
}
public interface hanmburger {
public void eat();
}
-
ConcreteProduct:具体产品
public class coca_cola implements coke{
@Override
public void drink() {
System.out.println("冰镇的可口可乐真好喝!");
}
}
public class pepsi_cola implements coke{
@Override
public void drink() {
System.out.println("冰镇的百事可乐真好喝!");
}
}
public class mac_hamburger implements hanmburger {
@Override
public void eat() {
System.out.println("麦当劳蔬菜双层牛堡~");
}
}
public class kfc_hamburger implements hanmburger {
@Override
public void eat() {
System.out.println("肯德基烤鸡腿堡~");
}
}
建造者模式
模式结构:
java代码:
public class testClient {
@Test
public void main() {
//可口可乐
coke coca = Director.createCoke(new cocaCokeBuilder());
coca.drink();
//百事可乐
coke pepsi = Director.createCoke(new pepsiCokeBuilder());
pepsi.drink();
}
}
-
Director:指挥建造的顺序
public class Director {
public static coke createCoke(cokeBuilder builder) {
return builder.createCap()
.createBottle()
.createLabel()
.finsh();
}
}
-
Builder:建造者抽象
public interface cokeBuilder {
public cokeBuilder createCap();
public cokeBuilder createBottle();
public cokeBuilder createLabel();
public coke finsh();
}
-
ConcreteBuilder:建造者具体实现
public class cocaCokeBuilder implements cokeBuilder {
private final coke coke = new coke();
@Override
public cokeBuilder createCap() {
coke.setCap("红色");
return this;
}
@Override
public cokeBuilder createBottle() {
coke.setBottle("塑料");
return this;
}
@Override
public cokeBuilder createLabel() {
coke.setLabel("可口可乐");
return this;
}
@Override
public coke finsh() {
coke.setCoke("可口可乐");
return coke;
}
}
public class pepsiCokeBuilder implements cokeBuilder {
private final coke coke = new coke();
@Override
public cokeBuilder createCap() {
coke.setCap("蓝色");
return this;
}
@Override
public cokeBuilder createBottle() {
coke.setBottle("塑料");
return this;
}
@Override
public cokeBuilder createLabel() {
coke.setLabel("百事可乐");
return this;
}
@Override
public coke finsh() {
coke.setCoke("百事可乐");
return coke;
}
}
-
Product:需要建造的产品
public class coke {
private String cap;
private String bottle;
private String label;
private String coke;
public void setCap(String cap) {
this.cap = cap;
}
public void setBottle(String bottle) {
this.bottle = bottle;
}
public void setLabel(String label) {
this.label = label;
}
public void setCoke(String coke) {
this.coke = coke;
}
public void drink(){
System.out.println(cap + "瓶盖,"+ bottle + "瓶身," + label + "标志的" + coke);
}
}
原型模式
模式结构:
java代码:
public class testClient {
@Test
public void main() throws CloneNotSupportedException {
//浅复制
cocaCoke c1 = new cocaCoke();
c1.setType("瓶装");
c1.setDesc("小卖部买的");
c1.setList(new ArrayList<>());
cocaCoke c2 = (cocaCoke) c1.clone();
c2.setDesc("家里拿的");
System.out.println(c1.toString());
System.out.println(c2.toString());
//引用类型共享
System.out.println(c1.getList() == c2.getList());
//深复制
pepsiCoke c3 = new pepsiCoke();
c3.setType("听装");
c3.setDesc("超市买的");
c3.setList(new ArrayList<>());
pepsiCoke c4 = (pepsiCoke) c3.clone();
c4.setDesc("邻居送的");
System.out.println(c3.toString());
System.out.println(c4.toString());
//引用类型独立
System.out.println(c3.getList() == c4.getList());
}
}
-
Prototype:原型类,java自带Cloneable接口
public interface Cloneable {
}
-
ConcretePrototype:具体原型类,实现一个克隆自身的操作
public class cocaCoke implements Cloneable {
private String type;
private String desc;
private List<String> list;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
@Override
public String toString() {
return "cocaCoke{" +
"type='" + type + '\'' +
", desc='" + desc + '\'' +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class pepsiCoke implements Cloneable {
private String type;
private String desc;
private List<String> list;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
@Override
public String toString() {
return "pepsiCoke{" +
"type='" + type + '\'' +
", desc='" + desc + '\'' +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
pepsiCoke coke = new pepsiCoke();
coke.setType(this.type);
coke.setDesc(this.desc);
return coke;
}
}
单例模式
模式结构:
java代码:
public class testClient {
@Test
public void main() throws CloneNotSupportedException {
//饿汉
cocaCoke coca = cocaCoke.getInstance();
//懒汉
pepsiCoke pepsi = pepsiCoke.getInstance();
}
}
-
Singleton:单例类
public class cocaCoke {
private static cocaCoke instance = new cocaCoke();
private cocaCoke(){
}
public static cocaCoke getInstance(){
return instance;
}
}
public class pepsiCoke {
private pepsiCoke(){
}
private static class SingletonHolder{
private final static pepsiCoke instance = new pepsiCoke();
}
public static pepsiCoke getInstance(){
return SingletonHolder.instance;
}
}