前言:
創建型設計模式:
-
簡單工廠模式(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;
}
}