
3.实现代码通常由一个工厂类( 负责实现创建所有子类实例的内部逻辑 ),多个具体产品类( 也就是具有不同实现的工厂子类 ),一个产品接口类( 是所有具体产品类的父类,提供描述所有产品类的公共接口 ),一个客户类( 负责调用来创建指定的某种产品 )共同组成。
举例 :假设一个玩具工厂可以创建小猫玩具和小狗玩具,而我们想通过指定的参数来让工厂创建指定类型的玩具,那么这个实现过程就可以采用简单工厂模式来实现。
不使用简单工厂
// 玩具接口
public interface Toy{
void printName();
}
// 小猫玩具实现类
public class CatToy implements Toy{
public void printName(){
System.out.println("这是小猫玩具");
}
}
// 小狗玩具实现类
public class DogToy implements Toy{
public void printName(){
System.out.println("这是小狗玩具");
}
}
// 测试客户端
public class ToyClient{
public static void main(String[] args) {
Toy cat = new CatToy();
cat.printName();
Toy dog = new DogToy();
dog.printName();
}
}
使用简单工厂
// 玩具接口
public interface Toy{
void printName();
}
// 小猫玩具实现类
public class CatToy implements Toy{
public void printName(){
System.out.println("这是小猫玩具");
}
}
// 小狗玩具实现类
public class DogToy implements Toy{
public void printName(){
System.out.println("这是小狗玩具");
}
}
// 玩具工厂
public class ToyFactory{
public static Toy createToy(String type){
Toy toy = null;
if(type == "cat"){
toy = new CatToy();
}else if(type == "dog"){
toy = new DogToy();
}
return toy;
}
}
// 测试客户端
public class ToyClient{
public static void main(String[] args) {
Toy cat = ToyFactory.createToy("小猫");
cat.printName();
Toy dog = ToyFactory.createToy("小狗");
dog.printName();
}
}
4.优点好处
二、工厂方法模式 1.简要概述JDK源码中的Calendar类
3.实现代码通常由一个工厂父类( 负责定义创建所有工厂子类实例的接口 ),多个具体工厂子类( 负责实现创建具体子类实例的内部逻辑 ),多个具体产品类( 具有不同实现的工厂子类 ),一个产品接口类( 是所有具体产品类的父类,提供描述所有产品类的公共接口 ),一个客户类( 负责调用来创建指定的某种产品 )共同组成。
举例 :假设一个玩具工厂可以创建小猫玩具和小狗玩具,而我们想通过指定类型的玩具工厂来创建这种类型的玩具,那么这个实现过程就可以采用工厂方法模式来实现。
不使用工厂方法
// 玩具接口
public interface Toy{
void printName();
}
// 小猫玩具实现类
public class CatToy implements Toy{
public void printName(){
System.out.println("这是小猫玩具");
}
}
// 小狗玩具实现类
public class DogToy implements Toy{
public void printName(){
System.out.println("这是小狗玩具");
}
}
// 玩具工厂
public class ToyFactory{
public static Toy createToy(String type){
Toy toy = null;
if(type == "cat"){
toy = new CatToy();
}else if(type == "dog"){
toy = new DogToy();
}
return toy;
}
}
// 测试客户端
public class ToyClient{
public static void main(String[] args) {
Toy cat = ToyFactory.createToy("小猫");
cat.printName();
Toy dog = ToyFactory.createToy("小狗");
dog.printName();
}
}
使用工厂方法
// 玩具接口
public interface Toy{
void printName();
}
// 小猫玩具实现类
public class CatToy implements Toy{
public void printName(){
System.out.println("这是小猫玩具");
}
}
// 小狗玩具实现类
public class DogToy implements Toy{
public void printName(){
System.out.println("这是小狗玩具");
}
}
// 玩具工厂父类
public abstract class ToyFactory{
public abstract Toy createToy();
}
// 小猫玩具工厂子类
public class CatToyFactory extends ToyFactory{
public Toy createToy(){
return new CatToy();
}
}
// 小狗玩具工厂子类
public class DogToyFactory extends ToyFactory{
public Toy createToy(){
return new DogToy();
}
}
// 测试客户端
public class ToyClient{
public static void main(String[] args) {
ToyFactory catFactory = new CatToyFactory();
Toy cat = catFactory.createToy();
cat.printName();
ToyFactory dogFactory = new DogToyFactory();
Toy dog = dogFactory.createToy();
dog.printName();
}
}
4.优点好处
具体产品子类较多的时侯,工厂子类也会跟着增加,所以增加了系统的复杂程度。
6.应用场景JDK源码中的Charset类
工厂父类:
工厂子类: