学习工厂模式必须知道的概念:
产品等级和产品簇的关系:
我们平时创建对象的方式:
//抽象产品
interface Foot {void eat();
}
//具体产品(汉堡包
class Hamburger implements com.shi.design.simple_factory.Foot {@Overridepublic void eat() {System.out.println("在吃汉堡包!");}
}
//上面代码为服务端,下面为客户端,我们身份为客户身份,不能修改服务端代码
//=============================================
public class Test {public static void main(String[] args) {Foot f = new Hamburger();f.eat();}
}
上面的这种设计十分脆弱,因为只要服务端修改了代码,客户端也必须跟着修改,这样的设计,服务端和客户端是耦合的。我们需要的是,无论服务端怎么修改,我们客户端的代码是不需要改变的。
针对上面的问题,我们采用简单工厂模式进行修改
//抽象产品
interface Foot {void eat();
}//具体产品(汉堡包
class Hamburger implements Foot {@Overridepublic void eat() {System.out.println("在吃汉堡包!");}
}//具体产品(米线
class RiceNoodle implements Foot {@Overridepublic void eat() {System.out.println("在吃米线!");}
}//简单工厂类
class FootFactory {public static Foot getFoot(int type) {Foot foot = null;switch (type) {case 1:foot = new Hamburger();break;case 2:foot = new RiceNoodle();break;}return foot;}
}//时光线----上面为很久以前的代码,我们不能修改,下面为现在我们书写的代码
//==================================================
//
public class AppTest {public static void main(String[] args) {Foot foot = Foot(1);foot.eat();}
}
简单工厂的优点::
缺点:
简单工厂的UML类图
针对于简单工厂产生的问题,我们使用工厂方法模式
interface Foot {void eat();
}//具体产品(汉堡包
class Hamburger2 implements Foot {@Overridepublic void eat() {System.out.println("在吃汉堡包!");}
}//具体产品(米线
class RiceNoodle implements Foot {@Overridepublic void eat() {System.out.println("在吃米线!");}
}//设置工厂接口
interface FootFactory {Foot getFoot();
}//汉堡包工厂
class HambergerFactory implements FootFactory {@Overridepublic Foot getFoot() {return new Hamburger2();}
}//米线接口
class RiceNoodleFactory implements FootFactory {@Overridepublic Foot getFoot() {return new RiceNoodle();}
}class Product {public static void Evaluate(FootFactory footFactory){Foot foot = Foot();System.out.println("评委A开始品尝");foot.eat();Foot foot1 = Foot();System.out.println("评委B开始品尝");foot1.eat();Foot foot2 = Foot();System.out.println("评委C开始品尝");foot2.eat();}
}//===================================
//扩充方法
class ColdRice implements Foot {@Overridepublic void eat() {System.out.println("在吃凉皮!");}
}//凉皮创建工厂
class ColdRiceFactory implements FootFactory {@Overridepublic Foot getFoot() {return new ColdRice();}
}public class AppTest {public static void main(String[] args) {HambergerFactory hambergerFactory = new HambergerFactory();Foot foot = Foot();foot.eat();Product.Evaluate(new HambergerFactory());}
}
优点:
杆点:
缺点: 如果有多个产品等级,那么工厂类的数量就会爆炸式增长。
工厂方法模式的UML类图:
针对工厂方法模式的缺点,我们使用抽象工厂模式。
简单来说,其实抽象工厂与工厂的区别就是将造对象的过程模拟化,比如,套餐,所有店里面都有吃和喝的,所以创建的时候就将吃和喝的放在同一个工厂里面创建,从而减少代码。
//食物接口
interface Foot {void eat();
}//具体产品(汉堡包
class Hamburger implements Foot {@Overridepublic void eat() {System.out.println("在吃汉堡包!");}
}//具体产品(米线
class RiceNoodle implements Foot {@Overridepublic void eat() {System.out.println("在吃米线!");}
}
//饮料接口
interface Drink {public void drink();
}//抽象产品 可乐
class Cola implements Drink {@Overridepublic void drink() {System.out.println("在喝可乐");}
}//抽象产品 冰峰
class IcePeak implements Drink {@Overridepublic void drink() {System.out.println("在喝冰峰");}
}//设置工厂接口
interface Factory {Foot getFoot();Drink getDrink();
}//肯德基(KFC)工厂
class KFCFactory implements Factory {@Overridepublic Foot getFoot() {return new Hamburger();}@Overridepublic Drink getDrink() {return new Cola();}
}//三秦工厂
class SanQinFactory implements Factory {@Overridepublic Foot getFoot() {return new RiceNoodle();}@Overridepublic Drink getDrink() {return new IcePeak();}
}class Product {public static void Evaluate(Factory footFactory){Foot foot = Foot();Drink drink = Drink();System.out.println("评委A开始品尝");foot.eat();drink.drink();Foot foot1 = Foot();Drink drink1 = Drink();System.out.println("评委B开始品尝");foot1.eat();drink1.drink();Foot foot2 = Foot();Drink drink2 = Drink();System.out.println("评委C开始品尝");foot2.eat();drink2.drink();}
}//===================================
public class AppTest {public static void main(String[] args) {KFCFactory kfcgerFactory = new KFCFactory();Foot foot = Foot();foot.eat();Product.Evaluate(new KFCFactory());}
}
优点:
杆点:
缺点:
抽象工厂UML类图
结论:当产品等级比较固定,就可以考虑使用抽象工厂,如果产品等级经常变化,则不建议使用抽象工厂。
以上内容为课后总结,如有侵权,请告知本人!
本文发布于:2024-01-28 10:40:42,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064096466839.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |