一、前言:
- 简单工厂模式:一个工厂类根据传入的参量决定创建出那一种产品类的实例。
(注:简单工厂模式 不属于23种设计模式之一,目的只为与其下对比)- 工厂方法模式:定义一个创建对象的接口,让子类决定实例化那个类。
- 抽象工厂模式:创建相关或依赖对象的家族,而无需明确指定具体类。
1.1、UML图:
二、简单工厂模式:
2.1、代码实例:
Step 1) 创建 Piizza 抽象类:
public abstract class Piizza {
protected String name;
public abstract void prepare();
public void bake(){
System.out.println(name + " baking;");
}
public void cut(){
System.out.println(name + " cutting;");
}
public void box(){
System.out.println(name + " boxing;");
}
public void setName(String name){
this.name = name;
}
}
Step 2) 创建 CheesePIzza 实现类:
public class CheesePIzza extends Piizza{
@Override
public void prepare() {
System.out.println("给制作奶酪披萨原材料");
}
}
Step 3) 创建 GreekPozza 实现类:
public class GreekPozza extends Piizza{
@Override
public void prepare() {
System.out.println("给希腊披萨准备原材料");
}
}
Step 4) 创建 OrderPizza 类:
public class OrderPizza {
String orderType = "";
SimpFectory simpFectory;
Piizza piizza = null;
public OrderPizza(SimpFectory simpFectory){
setSimpFectory(simpFectory);
}
public void setSimpFectory(SimpFectory simpFectory){
this.simpFectory = simpFectory;
do{
orderType = gettype();
piizza = this.simpFectory.createPizza(orderType);
if(piizza != null){
piizza.prepare();
piizza.bake();
piizza.cut();
piizza.box();
}else {
System.out.println("订购 披萨 失败");
break;
}
}while (true);
}
private String gettype(){
try{
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type : ");
String str = strin.readLine();
return str;
}catch (IOException e){
e.printStackTrace();
return "";
}
}
}
Step 5) 创建 SimpFectory 类:
public class SimpFectory {
public Piizza createPizza(String orderTyoe){
Piizza pizza = null;
System.out.println("使用简单工厂模式");
if(orderTyoe.equals("greek")){
pizza = new GreekPozza();
pizza.setName("希腊披萨");
}else if(orderTyoe.equals("cheese")){
pizza = new CheesePIzza();
pizza.setName("奶酪披萨");
}else if(orderTyoe.equals("prpper")){
pizza = new CheesePIzza();
pizza.setName("胡椒披萨");
}
return pizza;
}
}
Step 6) 创建 mian 方法:
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza(new SimpFectory());
System.out.println("--退出程序--");
}
}
三、工厂方法模式:
3.1、代码实例:
Step 1) 创建 Piizza 抽象类:
public abstract class Piizza {
protected String name;
public abstract void prepare();
public void bake(){
System.out.println(name + " baking;");
}
public void cut(){
System.out.println(name + " cutting;");
}
public void box(){
System.out.println(name + " boxing;");
}
public void setName(String name){
this.name = name;
}
}
Step 2) 创建 BJChessePizza 实现类:
public class BJChessePizza extends Piizza{
@Override
public void prepare() {
setName("北京奶酪披萨");
System.out.println("北京奶酪披萨");
}
}
Step 3) 创建 BJGreekPizza 实现类:
public class BJGreekPizza extends Piizza{
@Override
public void prepare() {
setName("北京胡椒披萨");
System.out.println("北京胡椒披萨");
}
}
Step 4) 创建 LDChessPizza 实现类:
public class LDChessPizza extends Piizza{
@Override
public void prepare() {
setName("伦敦奶酪披萨");
System.out.println("伦敦奶酪披萨");
}
}
Step 5) 创建 LDGreekPizza 实现类:
public class LDGreekPizza extends Piizza{
@Override
public void prepare() {
setName("伦敦奶酪披萨");
System.out.println("伦敦奶酪披萨");
}
}
Step 6) 创建 OrderPizza 抽象类:
public abstract class OrderPizza {
abstract Piizza createPizza(String orderType);
public OrderPizza() {
Piizza piizza = null;
String orderType;
do{
orderType = gettype();
piizza = createPizza(orderType);
if(piizza != null){
piizza.prepare();
piizza.bake();
piizza.cut();
piizza.box();
}else {
System.out.println("订购 披萨 失败");
break;
}
}while (true);
}
private String gettype(){
try{
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type : ");
String str = strin.readLine();
return str;
}catch (IOException e){
e.printStackTrace();
return "";
}
}
}
Step 7) 创建 BJoderPizza 实现类:
public class BJoderPizza extends OrderPizza{
@Override
Piizza createPizza(String orderType) {
Piizza piizza = null;
if(orderType.equals("cheese")){
piizza = new BJChessePizza();
}else if (orderType.equals("greek")){
piizza = new BJGreekPizza();
}else {
piizza = null;
}
return piizza;
}
}
Step 8) 创建 LDoderPizza 实现类:
public class LDoderPizza extends OrderPizza{
@Override
Piizza createPizza(String orderType) {
Piizza piizza = null;
if(orderType.equals("cheese")){
piizza = new LDChessPizza();
}else if (orderType.equals("greek")){
piizza = new LDGreekPizza();
}
return piizza;
}
}
Step 6) 创建 mian 方法:
public class PizzaStore {
public static void main(String[] args) {
// new BJoderPizza();
// System.out.println("--退出程序--");
new LDoderPizza();
System.out.println("--退出程序--");
}
}
四、抽象工厂模式:
4.1、代码实例:
Step 1) 创建 Piizza 抽象类:
public abstract class Piizza {
protected String name;
public abstract void prepare();
public void bake(){
System.out.println(name + " baking;");
}
public void cut(){
System.out.println(name + " cutting;");
}
public void box(){
System.out.println(name + " boxing;");
}
public void setName(String name){
this.name = name;
}
}
Step 2) 创建 BJChessePizza 实现类:
public class BJChessePizza extends Piizza{
@Override
public void prepare() {
setName("北京奶酪披萨");
System.out.println("北京奶酪披萨");
}
}
Step 3) 创建 BJGreekPizza 实现类:
public class BJGreekPizza extends Piizza{
@Override
public void prepare() {
setName("北京胡椒披萨");
System.out.println("北京胡椒披萨");
}
}
Step 4) 创建 LDChessPizza 实现类:
public class LDChessPizza extends Piizza{
@Override
public void prepare() {
setName("伦敦奶酪披萨");
System.out.println("伦敦奶酪披萨");
}
}
Step 5) 创建 LDGreekPizza 实现类:
public class LDGreekPizza extends Piizza{
@Override
public void prepare() {
setName("伦敦奶酪披萨");
System.out.println("伦敦奶酪披萨");
}
}
Step 6) 创建 AbsFactory 接口:
public interface AbsFactory {
public Piizza createPizza(String orderType);
}
Step 7) 创建 BJoderPizza 实现接口:
public class BJoderPizza implements AbsFactory {
@Override
public Piizza createPizza(String orderType) {
Piizza piizza = null;
if(orderType.equals("cheese")){
piizza = new BJChessePizza();
}else if (orderType.equals("greek")){
piizza = new BJGreekPizza();
}else {
piizza = null;
}
return piizza;
}
}
Step 8) 创建 LDoderPizza 实现接口:
public class LDoderPizza implements AbsFactory {
@Override
public Piizza createPizza(String orderType) {
Piizza piizza = null;
if(orderType.equals("cheese")){
piizza = new LDChessPizza();
}else if (orderType.equals("greek")){
piizza = new LDGreekPizza();
}
return piizza;
}
}
Step 9) 创建 OrderPizza 类:
public class OrderPizza {
AbsFactory factory;
public OrderPizza(AbsFactory factory) {
serFactory(factory);
}
private void serFactory(AbsFactory factory){
Piizza piizza = null;
String orderType = "";
this.factory = factory;
do{
orderType = gettype();
piizza = factory.createPizza(orderType);
if(piizza != null){
piizza.prepare();
piizza.bake();
piizza.cut();
piizza.box();
}else {
System.out.println("订购 披萨 失败");
break;
}
}while (true);
}
private String gettype(){
try{
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type : ");
String str = strin.readLine();
return str;
}catch (IOException e){
e.printStackTrace();
return "";
}
}
}
Step 10) 创建 mian 方法:
public class PizzaStore {
public static void main(String[] args) {
// new OrderPizza(new BJoderPizza());
// System.out.println("--退出程序--");
new OrderPizza(new LDoderPizza());
System.out.println("--退出程序--");
}
}
• 由 ChiKong_Tam 写于 2020 年 10 月 17 日