首页 技术 正文
技术 2022年11月21日
0 收藏 623 点赞 3,559 浏览 2511 个字

设计模式

工厂模式:定义一个创建对象的接口,但由子类决定要实例化的是哪一个。工厂方法让类把实例化推迟到子类。所谓的“决定”,并非指模式同意子类本身在执行时做决定,而是指在编写创建者类时。不须要知道实际创建的产品是哪一个。

选择了使用这个子类,就自然的决定了实际创建的产品是什么。

抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族。而不须要指定详细类。抽象工厂的任务时定义一个负责创建一组产品的接口。这个接口内的每一个产品都负责创建一个详细产品。使用工厂方法。

设计原则(1)多用组合,少用继承(2)针对接口编程,不针对实现编程(3)为交互对象之间的松耦合设计而努力(4)类应该对扩展开放,对改动关闭(5)依赖倒用原则:要依赖抽象,不要依赖详细类。不能让高层组件依赖底层组件。并且。无论是高层或低层。两者都应该依赖于抽象。指导方针:变量不能够持有详细类的引用(假设使用new,能够改用工厂来避开这样做法);不要让类派生自详细类(派生自一个接口或者抽象类);不要覆盖基类中已实现的方法(积累中已经实现的方法。应该有全部子类共享)
要点全部的工厂都是用来封装对象的创建的。工厂方法使用继承:把对象的创建托付给子类,子类实现工厂方法来创建对象。抽象工厂使用对象组合:对象的创建被实如今工厂接口所暴露的方法中。工厂方法同意将实例化延迟到子类进行。

public abstract class Pizza {
String name;
String dough;
String sauce;
ArrayList toppings = new ArrayList();void prepare() {
System.out.println("Preparing " + name);
System.out.println("Tossing dough...");
System.out.println("Adding sauce...");
System.out.println("Adding toppings: ");
for (int i = 0; i < toppings.size(); i++) {
System.out.println(" " + toppings.get(i));
}
}void bake() {
System.out.println("Bake for 25 minutes at 350");
}void cut() {
System.out.println("Cutting the pizza into diagonal slices");
}void box() {
System.out.println("Place pizza in official PizzaStore box");
}public String getName() {
return name;
}public String toString() {
StringBuffer display = new StringBuffer();
display.append("---- " + name + " ----\n");
display.append(dough + "\n");
display.append(sauce + "\n");
for (int i = 0; i < toppings.size(); i++) {
display.append((String )toppings.get(i) + "\n");
}
return display.toString();
}
}public class NYStyleCheesePizza extends Pizza {public NYStyleCheesePizza() {
name = "NY Style Sauce and Cheese Pizza";
dough = "Thin Crust Dough";
sauce = "Marinara Sauce";toppings.add("Grated Reggiano Cheese");
}
}public abstract class PizzaStore {abstract Pizza createPizza(String item);public Pizza orderPizza(String type) {
//创建对象的接口
Pizza pizza = createPizza(type);
System.out.println("--- Making a " + pizza.getName() + " ---");
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}public class NYPizzaStore extends PizzaStore {
//由子类来决定详细实例化哪个
Pizza createPizza(String item) {
if (item.equals("cheese")) {
return new NYStyleCheesePizza();
} else if (item.equals("veggie")) {
return new NYStyleVeggiePizza();
} else if (item.equals("clam")) {
return new NYStyleClamPizza();
} else if (item.equals("pepperoni")) {
return new NYStylePepperoniPizza();
} else return null;
}
}public class PizzaTestDrive {public static void main(String[] args) {
PizzaStore nyStore = new NYPizzaStore();
PizzaStore chicagoStore = new ChicagoPizzaStore();Pizza pizza = nyStore.orderPizza("cheese");
System.out.println("Ethan ordered a " + pizza.getName() + "\n");pizza = chicagoStore.orderPizza("cheese");
System.out.println("Joel ordered a " + pizza.getName() + "\n");
}

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,904
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,430
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,247
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,058
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,690
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,727